我使用正则表达式查找:
test:?后面跟着任何字符,直到它到达下一个字符为止:
test:?现在,当我运行这个正则表达式时,我做了:
((?:test:\?)(.*)(?!test:\?))关于这一案文:
test:?foo2=bar2&baz2=foo2test:?foo=bar&baz=footest:?foo2=bar2&baz2=foo2我本以为会得到:
test:?foo2=bar2&baz2=foo2
test:?foo=bar&baz=foo
test:?foo2=bar2&baz2=foo2相反,它与所有的东西都匹配。有更多经验的人知道我哪里出了问题吗?我以前曾使用regexes进行模式匹配,但这是我第一次体验旁观者/ahead。
谢谢您的帮助/提示/提示:-)
发布于 2012-02-25 01:46:50
我想你可以探索一个贪婪的版本。
(扩大)
(test:\? (?: (?!test:\?)[\s\S])* )
发布于 2012-02-25 00:52:43
三个问题:
(?!)是一个负面的前瞻性断言。相反,你想要的是test:?.(?=),要求接下来的是.*是贪婪的;你想要的是非贪婪的,所以你只需要抓住第一个块。$。。
最终结果:
(?:test:\?)(.*?)(?=test:\?|$)我也移除了外面的那群人,看不出里面有什么意义。我所知道的所有RE引擎都允许您访问组0作为完全匹配,或者其他类似的方式(尽管在查找所有匹配时可能不是这样)。如果你需要的话可以放回去。
(这适用于PCRE;不确定它是否适用于POSIX正则表达式,因为我不习惯使用它们。)
不过,如果您只想在test:?上拆分,那么正则表达式就是错误的工具。使用您的语言对这些事情的内置支持来拆分字符串。
Python:
>>> re.findall('(?:test:\?)(.*?)(?=test:\?|$)',
... 'test:?foo2=bar2&baz2=foo2test:?foo=bar&baz=footest:?foo2=bar2&baz2=foo2')
['foo2=bar2&baz2=foo2', 'foo=bar&baz=foo', 'foo2=bar2&baz2=foo2']发布于 2012-02-25 00:48:32
您可能需要((?:test:\?)(.*?)(?=test:\?)),尽管您还没有告诉我们您使用哪种语言来驱动regexes。
.*?匹配尽可能少的字符,而不阻止整个字符串匹配,其中.*匹配尽可能多(贪婪)。
这取决于您所使用的语言,您可能需要匹配,然后分割字符串,然后再匹配,或者调用特定于语言的match_all类型函数。
顺便说一句,您不需要使用前瞻性(您只需要匹配要搜索的模式)来锚定正则表达式,所以在您的情况下,这(很可能)是这样的:
test:[?](.*?)test:[?]https://stackoverflow.com/questions/9440084
复制相似问题