如何多行正则表达式但在第一次匹配后停止?

How to multiline regex but stop after first match?

我需要匹配任何具有特定特征的字符串,但我认为启用 /m 标志会破坏功能。

我知道的:

  1. 字符串将以引号开头和结尾。
  2. 该字符串将包含以下单词。 "the"、"fox" 和 "lazy"。
  3. 字符串中间可能有换行符。
  4. 字符串永远不会有 at 符号(在正则表达式语句中使用)

我的问题是,如果我在单个文本块中有两次字符串,它 returns 一次,将第一个引号和最后一个引号之间的所有内容与中间的所需单词匹配。

这是我的正则表达式:

/^"the[^@]*fox[^@]*lazy[^@]*"$/gim

And a Regex101 example.

这是我对声明的理解。匹配字符串以 "the 开头且字符串以 " 结尾的某处有单词 foxlazy(按此顺序)。也忽略换行符和区分大小写。

最常见的限制答案是(.*?),但它不适用于换行。并且放置 [^@?]* 不起作用,因为它将 ? 添加到要忽略的事物列表中。

那么我怎样才能让 "match everything until ___" 不跳过直到最后一个实例,同时仍然能够忽略换行符?

这不是我能找到的任何其他内容的副本,因为它处理多行匹配,而那些不处理。

在输入这个问题时得出的答案可能看起来非常明显。

?放在*后面,不要放在括号里面。 Parenthesis和Brackets不是类比的,?应该是相对于*.

更正的正则表达式:

/^"the[^@]*?fox[^@]*?lazy[^@]*?"$/gim

Example from Regex101.

这个的长短是:

非贪心,多行匹配可以用[^@]*?

实现

(将 @ 替换为您不想匹配的内容)

在你的例子中,你所有的量词都需要是非贪婪的,所以你可以只使用标志 ungreedy: U.

/^"the[^@]*fox[^@]*lazy[^@]*"$/gimU

Example on Regex101.