您不需要转义单引号,只需转义双引号即可。一旦变量被分配了字符串常量,它就可以自由传递并且不会改变。
您对大正则表达式遇到的唯一真正问题是它不匹配,因为您在其中留下了一些“空气”。
这就是你所拥有的:
"^[ ]?([^\ ,()""'']+)(?:[ ](\(([^)]*?)\)))?[ ]((?:(([^\ ,()""''])[^\ ,()""'']*)[ ])([^\ ,()""'']+(?:[ ][^\ ,()""'']+)*))(?: [ ]? , [ ]?(.*?))?[ ]?(\(\s*'*\d*\s*\))[ ]?$"
这应该是这样的:
"^[ ]?([^\ ,()""']+)(?:[ ](\(([^)]*?)\)))?[ ]((?:(([^\ ,()""'])[^\ ,()""']*)[ ])([^\ ,()""']+(?:[ ][^\ ,()""']+)*))(?:[ ]?,[ ]?(.*?))?[ ]?(\(\s*'*\d*\s*\))[ ]?$"
这是一个使用正则表达式的测试用例(如果我记得的话,它只匹配 multi-last 形式):
Dim RXE As Object
Dim RXNorm As Object
Sub RegexColumnValueComparison()
Dim strData As String
Dim strPat As String
Call InitializeRXs
' Here, the grad part ('#) is optional
strPat = "^[ ]?([^\ ,()""']+)(?:[ ](\(([^)]*?)\)))?[ ]((?:(([^\ ,()""'])[^\ ,()""']*)[ ])([^\ ,()""']+(?:[ ][^\ ,()""']+)*))(?:[ ]?,[ ]?(.*?))?[ ]?(?:(\(\s*'*\d*\s*\))[ ]?)?$"
' Here, the grad part ('#) is required
'strPat = "^[ ]?([^\ ,()""']+)(?:[ ](\(([^)]*?)\)))?[ ]((?:(([^\ ,()""'])[^\ ,()""']*)[ ])([^\ ,()""']+(?:[ ][^\ ,()""']+)*))(?:[ ]?,[ ]?(.*?))?[ ]?(\(\s*'*\d*\s*\))[ ]?)$"
strData = " John Bert Smith, Jr ('78) "
MsgBox (RxRepl(strData, strPat, "$7 $8 , $1 $3 $6 $9"))
End Sub
Function RxRepl(sData As String, sPat As String, sRepl As String) As String
sData = RXNorm.Replace(sData, " ")
RXE.Pattern = sPat
' Can test for pass/fail ..
'If RXE.Test(sData) Then
' MsgBox ("matched pattern")
'Else
' MsgBox ("did NOT match pattern")
'End If
RxRepl = RXE.Replace(sData, sRepl)
End Function
Sub InitializeRXs()
Set RXE = CreateObject("vbscript.regexp")
Set RXNorm = CreateObject("vbscript.regexp")
RXE.Global = True
RXNorm.Global = True
RXNorm.Pattern = "\s+"
End Sub