为什么这个正则表达式需要 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/ *')[^']+
详情:
(?<=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。
我有一个正则表达式模式,似乎需要一个 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/ *')[^']+
详情:
(?<=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。