【问题标题】:Regex to first occurrence only? [duplicate]正则表达式仅第一次出现? [复制]
【发布时间】:2010-01-15 20:08:47
【问题描述】:

假设我有以下字符串:

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

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

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

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

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

我好像很容易忘记这件事。

【问题讨论】:

    标签: regex


    【解决方案1】:

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

    this(.*?)test

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

    【讨论】:

    • 谢谢...这就是我的想法。我在正则表达式测试器上对其进行了测试,它可以工作。所以我用来做一些查找和替换魔法的应用程序(EditPlus)显然无法识别?量词。
    • 根据我的回答,如果嵌入了“this”和“test”,您可能无法获得完美的结果。如果这可能是个问题,请考虑调查一下。
    【解决方案2】:

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

    事实上,this(.*?)test 将匹配“蓟草是最伟大的”,这可能是你不想要的。

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

    【讨论】:

      【解决方案3】:

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

      There is a good explanation of greediness here.

      【讨论】:

        【解决方案4】:

        对我来说,只需删除 /g 即可。

        https://regex101.com/r/EaIykZ/1

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-06-28
          • 1970-01-01
          • 2016-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-13
          相关资源
          最近更新 更多