首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场

Regex前瞻
EN

Stack Overflow用户
提问于 2012-02-25 00:45:41
回答 3查看 4.2K关注 0票数 5

我使用正则表达式查找:

代码语言:javascript
运行
复制
test:?

后面跟着任何字符,直到它到达下一个字符为止:

代码语言:javascript
运行
复制
test:?

现在,当我运行这个正则表达式时,我做了:

代码语言:javascript
运行
复制
((?:test:\?)(.*)(?!test:\?))

关于这一案文:

代码语言:javascript
运行
复制
test:?foo2=bar2&baz2=foo2test:?foo=bar&baz=footest:?foo2=bar2&baz2=foo2

我本以为会得到:

代码语言:javascript
运行
复制
test:?foo2=bar2&baz2=foo2

test:?foo=bar&baz=foo

test:?foo2=bar2&baz2=foo2

相反,它与所有的东西都匹配。有更多经验的人知道我哪里出了问题吗?我以前曾使用regexes进行模式匹配,但这是我第一次体验旁观者/ahead。

谢谢您的帮助/提示/提示:-)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-25 01:46:50

我想你可以探索一个贪婪的版本。

(扩大)

(test:\? (?: (?!test:\?)[\s\S])* )

票数 4
EN

Stack Overflow用户

发布于 2012-02-25 00:52:43

三个问题:

  • (?!)是一个负面的前瞻性断言。相反,你想要的是test:?.
  • The (?=),要求接下来的是.*是贪婪的;你想要的是非贪婪的,所以你只需要抓住第一个块。
  • ,你也想要最后一个块,所以你想在最后匹配$

最终结果:

代码语言:javascript
运行
复制
(?:test:\?)(.*?)(?=test:\?|$)

我也移除了外面的那群人,看不出里面有什么意义。我所知道的所有RE引擎都允许您访问组0作为完全匹配,或者其他类似的方式(尽管在查找所有匹配时可能不是这样)。如果你需要的话可以放回去。

(这适用于PCRE;不确定它是否适用于POSIX正则表达式,因为我不习惯使用它们。)

不过,如果您只想在test:?上拆分,那么正则表达式就是错误的工具。使用您的语言对这些事情的内置支持来拆分字符串。

Python:

代码语言:javascript
运行
复制
>>> 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']
票数 0
EN

Stack Overflow用户

发布于 2012-02-25 00:48:32

您可能需要((?:test:\?)(.*?)(?=test:\?)),尽管您还没有告诉我们您使用哪种语言来驱动regexes。

.*?匹配尽可能少的字符,而不阻止整个字符串匹配,其中.*匹配尽可能多(贪婪)。

这取决于您所使用的语言,您可能需要匹配,然后分割字符串,然后再匹配,或者调用特定于语言的match_all类型函数。

顺便说一句,您不需要使用前瞻性(您只需要匹配要搜索的模式)来锚定正则表达式,所以在您的情况下,这(很可能)是这样的:

代码语言:javascript
运行
复制
test:[?](.*?)test:[?]
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9440084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档