正则表达式首次出现?

时间:2010-01-15 20:08:48

标签: regex

假设我有以下字符串:

  

这是一个考验   测试。这只是一个测试。结束。

我要选择this is a testthis is only a test。我需要做什么?

我试过的以下正则表达式产生了一个愚蠢的结果:

this(.*)test(我也想捕捉它之间的内容)

返回this is a test for the sake of testing. this is only a test

这似乎很容易让我忘记了。

4 个答案:

答案 0 :(得分:26)

正则表达式是贪婪的,这意味着它将捕获尽可能多的字符,这些字符属于.*匹配。为了使它不贪婪尝试:

this(.*?)test

?修饰符会使其在匹配中捕获尽可能少的字符。

答案 1 :(得分:8)

Andy E和Ipsquiggle有正确的想法,但我想指出你可能想要添加一个单词边界断言,这意味着你不想处理其中包含“this”或“test”的单词 - 只有自己的话。在Perl和类似的“\ b”标记。

实际上,this(.*?)test会匹配“蓟是最伟大的”,你可能不想要它。

您想要的模式是这样的:\bthis\b(.*?)\btest\b

答案 2 :(得分:3)

*是一个贪婪的量词。这意味着它尽可能匹配,即你所看到的。根据正则表达式的特定语言支持,您需要找到一个非贪婪的量词。通常这是一个尾随问号,如下所示:*?。这意味着一旦正则表达式的其余部分得到满足,它就会停止使用字母。

There is a good explanation of greediness here.

答案 3 :(得分:1)

对我来说,只需删除/ g工作。

请参阅https://regex101.com/r/EaIykZ/1