为什么这个正则表达式需要 space?

Why does this regex need a space?

我有一个正则表达式模式,似乎需要一个 space 才能工作,但我不明白为什么。这是我做的一个测试方法,我想匹配两个'之间的字符,但前提是它被其他字符包围并且整个过程中有可选的space。

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 等于 "Bar",但 resultA.Value 只是 space。正则表达式模式之间的唯一区别是 ASSIGN\/ 之后的 space(我知道!)我希望这个 space 是可选的,我认为 ([ ']+)?会实现。

应匹配的其他示例...

Foo=ASSIGN/'Bar' 应该匹配 Bar

Foo = ASSIGN/'Bar'(可以是多个 space)应该匹配 Bar

Foo = ASSIGN/ 'Foo.Bar.Foo.A1-0' 应该匹配 Foo.Bar.Foo.A1-0

您首先正则表达式与 space 匹配,因为满足后向条件(该模式正好在 space 之前找到)和前向 - (?=([' ]+)?) - 没有任何区别,因为它需要一个可选模式,它可能存在也可能不存在,因此完全是多余的。

我觉得你需要

(?<=Foo *= *ASSIGN/ *')[^']+

regex demo

详情:

  • (?<=Foo *= *ASSIGN/ *') - 位置前面必须有Foo, 0+ spaces, =, 0+ spaces, ASSIGN/ 和零个或多个 spaces
  • [^']+ - '
  • 以外的 1+ 个字符

注意如果你不需要重叠匹配,你可以使用捕获并使用

Foo *= *ASSIGN/ *'([^']+)

并获取第 1 组 (match.Groups(1).Value) 值。

如果数据可以不带单引号,并且您需要在回顾之后获得任何 1+ 非白色 space 字符块,我建议使用

Foo *= *ASSIGN/ *(?:'(?<v>[^']+)'|(?<v>\S+))

并获取 v 组内容。参见 this regex demo