正则表达式懒惰量词表现得贪婪

时间:2014-08-30 12:17:33

标签: jquery regex

我有这样的文字;

[Some Text][1][Some Text][2][Some Text][3][Some Text][4]

我想将[Some Text][2]与此正则表达式匹配;

/\[.*?\]\[2\]/

但它会返回[Some Text][1][Some Text][2]

我如何仅匹配[Some Text][2]

注意:某些文字中可能包含[]中的任何字符。方括号中的数字可以是任何数字,而不仅仅是1和2.我想要的Some Text匹配可以在行的开头,并且可以有多个Some Text s

JSFiddle

2 个答案:

答案 0 :(得分:0)

你可以试试下面的正则表达式,

(?!^)(\[[A-Z].*?\]\[\d+\])    

DEMO

答案 1 :(得分:0)

\[.*?\]\[2\]模式works like this

  • \[-查找最左边的[(正则表达式引擎从左到右处理字符串输入)
  • .*?-匹配除换行符以外的任何0+字符,尽可能少,满足成功匹配所需的数目,以及后续模式,请参见下文
  • \]\[2\]-][2]子字符串。

因此,.*?在每次失败时都会扩展,直到找到最左边的][2]请注意,延迟量词不能保证“最短”匹配。

解决方案

使用否定字符类而不是.*?(或.*),该字符类可以匹配除边界char以外的任何字符。

\[[^\]\[]*\]\[2\]

请参见this regex demo

在这里,.*?[^\]\[]*所取代-除][以外的0个或更多字符。

其他示例

  • <[^<>]*>匹配<...>,内部没有<>
  • \([^()]*\)匹配(...)且内部没有()
  • "[^"]*"匹配"...",内部没有"

在其他情况下,当起始模式是多字符字符串或复杂模式时,请使用tempered greedy token(?:(?!start).)*?。要匹配abc 1 def中的abc 0 abc 1 def,请使用abc(?:(?!abc).)*?def