如何多线正则表达但在第一场比赛后停止?

时间:2017-04-05 19:59:02

标签: regex multiline non-greedy

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

我所知道的:

  1. 字符串将以引号开头和结尾。
  2. 该字符串将包含以下字词。 “the”,“fox”和“懒惰”。
  3. 字符串中间可能有换行符。
  4. 字符串永远不会有at符号(在regex语句中使用)
  5. 我的问题是,如果我在单个文本块中有两次字符串,它会返回一次,匹配第一个引号和最后一个引号之间的所有内容以及中间所需的单词。

    这是我的正则表达式:

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

    And a Regex101 example

    以下是我对该陈述的理解。匹配字符串以"the开头的位置,并且在字符串以fox结尾之前的某个位置存在单词lazy"(按此顺序)。同时忽略换行符和区分大小写。

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

    那么我怎样才能保持“匹配所有内容直到___”从跳过到最后一个实例,同时仍能忽略换行符?

    这不是我能找到的任何其他内容的重复,因为这涉及多行匹配,而那些则没有。

2 个答案:

答案 0 :(得分:1)

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

?放在*之后,而不是括号内。括号和括号不相似,?应该与*相对。

更正了正则表达式:

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

Example from Regex101

长期和短期是:

使用[^@]*?

可以实现非贪婪,多行匹配

(用@代替你不想匹配的东西)

答案 1 :(得分:1)

在您的情况下,您的所有量词都需要非贪婪,因此您只需使用 ungreedy 标志:U

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

Example on Regex101