使用正则表达式匹配任何字符直到遇到一个子字符串?

6
我希望能够匹配一个特定的字符序列,该序列以特定子字符串开头并以特定子字符串结尾。如果一行中应该有多个匹配项,则我的正向预查正则表达式无法工作。我理解这是因为(.+)捕获了直到找到最后一个正向预查表达式的所有内容。如果它能捕获直到找到第一个表达式,那就太好了。
以下是我的正则表达式尝试:
@@FOO\[(.*)(?=~~)~~(.*)(?=\]@@)\]@@

样例输入:

@@FOO[abc~~hi]@@    @@FOO[def~~hey]@@

期望输出:2个匹配项,每个匹配项有2个匹配组(abc, hi)和(def, hey)。

实际输出:1个匹配项,有2个组(abc~~hi]@@ @@FOO[def, hey)

是否有办法得到期望的输出结果?

提前感谢!

3个回答

5
使用问号,它会尽可能少地匹配。
@@FOO\[(.*?)(?=~~)~~(.*?)(?=\]@@)\]@@

这个也可以工作,但不够严格,虽然更易于阅读。
@@FOO\[(.*?)~~(.*?)\]@@

谢谢,这正是我在寻找的!在研究时,我太专注于分组结构,完全忽略了*?。 - joshm1
1
我实际上几乎总是使用.*?而不仅仅是.*,因为我几乎从不意味着“尽可能匹配”。 - Chris Haas

3

*运算符默认为贪婪模式,这意味着它会尽可能地吞噬字符串,同时仍然留下足够的内容以匹配剩余的正则表达式。您可以通过在其后添加?来使其不贪婪。请务必阅读链接中的差异。


2
谢谢。多年来我在使用各种语言的正则表达式时,从未听说过*?。 - joshm1

0
你可以使用 String.IndexOf() 方法来查找子字符串的第一次出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接