正则表达式,用于替换包含单引号(')的字符串的一部分

时间:2019-05-11 15:23:10

标签: regex excel vba regex-group regex-greedy

我正在尝试替换撇号之间的文本的一部分,而不是全部,只是一部分。 例如,我需要将仅在引号之间的文本内的字符/ *和* /替换为空文本,而不是在它们之外。

我的输入文字,例如:

A = 'THIS IS AN ALPHABETIC /* CONSTANT' || WS_CON1 /* */ || 'TEST STRING */';

预期输出:

A = 'THIS IS AN ALPHABETIC  CONSTANT' || WS_CON1 /* */ || 'TEST STRING ';

我提取了引号中的文本,但是我不知道如何用空文本替换/ *和* /。

Sub ReplaceWithRegex()
    Dim strPattern As String
    Dim strReplace As String
    Dim regEx As Variant
    Dim strtxt As String

    Set regEx = CreateObject("vbscript.regexp")
    strtxt = "A = 'THIS IS AN ALPHABETIC /* CONSTANT' || WS_CON1 /* */ || ' TEST STRING */';"
    strPattern = "\'([^\']*)\'"
    strReplace = ""

    With regEx
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = strPattern
    End With

    If regEx.Test(strtxt) Then
        Debug.Print regEx.Replace(strtxt, strReplace)
    Else
        MsgBox ("Not matched")
    End If
End Sub

显然,这会将引号之间的所有文本替换为空字符串。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

此表达式可以帮助您替换不需要的b'

capitals.getOrElse("test","N/A")

您可以使用捕获组/*来简单地包装它的相关部分,类似于:

[A-Z]\s\/\*\s[A-Z]

然后,您可以将其替换为()并忽略第二个不需要的组:

enter image description here

This tool可帮助您根据需要修改/更改/编辑表达式。

RegEx描述图

link可帮助您形象化表情:

enter image description here

编辑

如果这些捕获组中可能有更多模式,则可以简单地使用 | such as添加它们:

([A-Z])\s(\/\*)\s([A-Z])

您可能还想使用$1 $3而不是([A-Z])\s(\/\*|\*\/)(\s[A-Z]|\x27) ,以便使您的代码易于阅读。

enter image description here

JavaScript演示

\x27

性能测试

此代码段返回一百万次'循环的运行时间。

const regex = /([A-Z])\s(\/\*|\*\/)(\s[A-Z]|\x27)/gm;
const str = `A = 'THIS IS AN ALPHABETIC /* CONSTANT\' || WS_CON1 /* */ || \'TEST STRING */';`;
const subst = `$1$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

答案 1 :(得分:4)

这是使用正则表达式的另一种VBA方法。

Option Explicit
'Set Reference to Microsoft VBScript Regular Expressions 5.5
Function reReplaceComment(S As String) As String
  Dim RE As RegExp
  Dim I As Long, J As Long

Set RE = New RegExp
With RE
    .Global = True
    .Pattern = "('[^']*?)(?:(?:/\*)|(?:\*/))([^']*?')"
    reReplaceComment = .Replace(S, "$1$2")
End With
End Function

删除单引号内的令牌

('[^']*?)(?:(?:/\*)|(?:\*/))([^']*?')

$ 1 $ 2

RegexBuddy创建

enter image description here