我希望能够匹配特定的字符序列,从特定的子字符串开始,以特定的子字符串结尾。如果在一条线上只有一个匹配的实例,那么我的正向前瞻性正则表达式会起作用,但如果一条线上应该有多个匹配则不行。我理解这是因为(。+)捕获所有内容,直到找到 last 正向前瞻表达式。如果它能捕获所有内容,直到找到第一个表达式,那就太好了。
这是我的正则表达式尝试:
@@FOO\[(.*)(?=~~)~~(.*)(?=\]@@)\]@@
示例输入:
@@FOO[abc~~hi]@@ @@FOO[def~~hey]@@
所需输出:2个匹配,每个匹配2个组(abc,hi)和(def,嘿)。
实际输出:1对2组(abc ~~ hi)@@ @@ FOO [def,嘿]
有没有办法获得所需的输出?
提前致谢!
答案 0 :(得分:5)
使用问号,它会尽可能少地匹配。
@@FOO\[(.*?)(?=~~)~~(.*?)(?=\]@@)\]@@
这个也有效,但不是那么严格,但更容易阅读
@@FOO\[(.*?)~~(.*?)\]@@
答案 1 :(得分:3)
默认情况下,*运算符为greedy,这意味着它尽可能多地占用字符串,同时仍然留下足以匹配剩余的正则表达式。你可以通过追加一个来使它不贪心吗?它。请务必阅读链接中的差异。
答案 2 :(得分:0)
您可以使用 String.IndexOf()方法来查找子字符串的第一个匹配项。