我有这个正则表达式:
(?:\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”字符参加比赛)。
有人请说明一下吗?
提前致谢!
答案 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)
仅匹配由非空格包围的+
。