我有一个正则表达式模式似乎需要一个空间才能工作,但我无法弄清楚原因。这是我已经制作的测试方法,我希望匹配两个'
之间的字符,但只有当它被其他字符包围并且整个可选空格时才会匹配。
Private Sub RegexTestSub()
Dim testString = "Foo = ASSIGN/ 'Bar'"
Dim patternA = "(?<=Foo([ ]+)?=([ ]+)?ASSIGN\/([ ']+)?)[a-zA-Z0-9-_. ]+(?=([' ]+)?)"
Dim patternB = "(?<=Foo([ ]+)?=([ ]+)?ASSIGN\/ ([ ']+)?)[a-zA-Z0-9-_. ]+(?=([' ]+)?)"
Dim resultA As Match = Regex.Match(testString, patternA)
Dim resultB As Match = Regex.Match(testString, patternB)
End Sub
两者都匹配,但resultB.Value
等于&#34; Bar&#34;但是resultA.Value
只是一个空间。正则表达式模式之间的唯一区别是ASSIGN\/
之后的空格(我意识到!)我希望这个空格是可选的,我认为([ ']+)?
会实现。
其他应该匹配的例子......
Foo=ASSIGN/'Bar'
应与Bar
Foo = ASSIGN/'Bar'
(可能是多个空格)应与Bar
Foo = ASSIGN/ 'Foo.Bar.Foo.A1-0'
应与Foo.Bar.Foo.A1-0
答案 0 :(得分:2)
你的第一个正则表达式与空格匹配,因为满足了后视条件(在空格之前找到了这个模式)和前瞻 - (?=([' ]+)?)
- 没有任何区别,因为它需要一个可选的模式,它可能在那里与否,因此完全是多余的。
我认为你需要
(?<=Foo *= *ASSIGN/ *')[^']+
请参阅regex demo
<强>详情:
(?<=Foo *= *ASSIGN/ *')
- 该位置必须以Foo
,0 +空格,=
,0 +空格,ASSIGN/
和零个或多个空格开头[^']+
- 除'
以外的1个字符注意如果您不需要重叠匹配,可以使用捕获并使用
Foo *= *ASSIGN/ *'([^']+)
并抓取第1组(match.Groups(1).Value
)值。
如果数据可以没有单引号,并且你需要在看到后面的任何一块1+非空白字符后得到,我建议使用
Foo *= *ASSIGN/ *(?:'(?<v>[^']+)'|(?<v>\S+))
并收集v
组内容。请参阅this regex demo。