如果角色参与前一场比赛,则正则表达式不匹配

时间:2010-12-01 11:49:43

标签: regex

我有这个正则表达式:

(?:\S)\++(?:\S)

应该捕获查询字符串中的所有内容,如下所示:

?busca=tenis+nike+categoria:"Tenis+e+Squash"&pagina=4&operador=or

应该是4场比赛,但只有3场比赛 S + N
È+ C
S + E

缺少最后一个:
È+ S

似乎发生了因为“e”角色参加了前一场比赛(s + e),因为“e”角色正好位于两个加号的中间(Teni s + e + S quash)。

如果使用以下输入测试正则表达式,则它与最后一个“+”匹配:

?busca=tenis+nike+categoria:"Tenis_e+Squash"&pagina=4&operador=or

(更改“s + e”代表“s_e”以便不让“e”字符参加比赛)。

有人请说明一下吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

在连续比赛中,下一场比赛的搜索从上一场比赛结束的位置开始。由于+之后的非空白字符也匹配,因此搜索下一个匹配将在该非空白字符之后开始。所以像s+e+S这样的序列只能找到一个匹配项:

s+e+S
\_/

你可以通过使用与假设的字符不匹配的外观断言来解决这个问题:

\S\++(?=\S)

这将匹配任何非空格字符,后跟一个或多个+,前提是后跟另一个非空白字符。

但是在URI查询中不允许使用空格,因为每个字符都是非空格,所以根本不需要周围的\S。因此,以下内容已经匹配了一个或多个+字符的每个序列:

\++

答案 1 :(得分:1)

你是对的:第四场比赛没有发生,因为周围的角色已经参加了上一场比赛。解决方案是使用环视(如果你的正则表达式实现支持它 - 例如,JavaScript不支持lookbehind)。

尝试

(?<!\s)\++(?!\s)

这匹配一个或多个+,除非它们被空格包围。如果加号位于字符串的开头或结尾,这也适用。

<强>解释

(?<!\s)  # assert that there is no space before the current position
         # (but don't make that character a part of the match itself)
\++      # match one or more pluses
(?!\s)   # assert that there is no space after the current position

如果你的正则表达式实现不支持lookbehind,你也可以使用

\S\++(?!\s)

这样,你的匹配将包含加号之前的字符,但不包含加之后的字符,因此不会有重叠匹配(感谢Gumbo!)。但是,这将无法匹配字符串开头的加号(因为\S确实需要匹配一个字符)。但这可能不是问题。

答案 2 :(得分:1)

您可以使用正则表达式:

(?<=\S)\++(?=\S)

仅匹配由非空格包围的+