为什么这个正则表达式需要一个空间?

时间:2017-01-09 10:47:52

标签: regex vb.net regex-lookarounds

我有一个正则表达式模式似乎需要一个空间才能工作,但我无法弄清楚原因。这是我已经制作的测试方法,我希望匹配两个'之间的字符,但只有当它被其他字符包围并且整个可选空格时才会匹配。

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

匹配

1 个答案:

答案 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