如何使正则表达式成为非贪婪的?

Rue*_*eta 206 javascript regex expression filter regex-greedy

我正在使用jQuery.我有一个带有特殊字符块的字符串(开头和结尾).我想从特殊字符块中获取文本.我使用正则表达式对象进行字符串查找.但是,当有两个特殊字符或更多时,如何告诉jQuery找到多个结果?

我的HTML:

<div id="container">
    <div id="textcontainer">
     Cu?c chi?n pháp lý gi?a [|c? th?|nghi?m|] th? tr??ng [|test2|?ây là test l?n 2|] ch?ng khoán [|M?|day la nuoc my|] và ngân hàng ??u t? quy?n l?c nh?t Ph? Wall m?i ch? b?t ??u.
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

和我的JavaScript代码:

$(document).ready(function() {
  var takedata = $("#textcontainer").text();
  var test = 'abcd adddb';
  var filterdata = takedata.match(/(\[.+\])/);

  alert(filterdata); 

  //end write js 
});
Run Code Online (Sandbox Code Playgroud)

我的结果是:[|cơthử|nghiệm|]thịtrường[| test2 |đâylàtestlần2|]chứngkhoán[|Mỹ| day la nuoc my |].但这不是我想要的结果:(.如何获得[文本]第1次和[演示]第2次?


我在互联网上搜索信息后完成了我的工作^^.我做这样的代码:

var filterdata = takedata.match(/(\[.*?\])/g);
Run Code Online (Sandbox Code Playgroud)
  • 我的结果是:[|cơthử|nghiệm|],[| test2 |đâylàtestlần2|] 这是对的!但我真的不明白这一点.你能回答我的原因吗?

Asa*_*aph 452

非贪婪的正则表达式修饰符就像它们贪婪的反对部分,但?紧接着它们:

*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)
Run Code Online (Sandbox Code Playgroud)

  • 可能有用的是注意`?`本身意味着'一个或零'(但是贪婪!).例如''bb'.replace(/ b?/,'a')//'ab'`和''bb'.replace(/ c?/,'a')//'abb' (26认同)
  • @MuhammadUmer我认为他是在建议,因为“c”不匹配,但你有“?”,即“0或1”,那么它将匹配“0个c字符”,因此将其替换。我不知道它是如何工作的,因为它不能在我尝试过的任何正则表达式引擎中编译 (4认同)
  • c 那里怎么没匹配到任何东西 (3认同)

pol*_*nts 35

你说贪婪是个问题是正确的:

--A--Z--A--Z--
  ^^^^^^^^^^
     A.*Z
Run Code Online (Sandbox Code Playgroud)

如果你想匹配两者A--Z,你必须使用A.*?Z(?使*"不情愿"或懒惰).

但是,有时候有更好的方法可以做到这一点,例如

A[^Z]*+Z
Run Code Online (Sandbox Code Playgroud)

这使用否定的字符类和占有量词来减少回溯,并且可能更有效.

在你的情况下,正则表达式将是:

/(\[[^\]]++\])/
Run Code Online (Sandbox Code Playgroud)

不幸的是, Javascript正则表达式不支持占有量词,所以你只需要:

/(\[[^\]]+\])/
Run Code Online (Sandbox Code Playgroud)

也可以看看


快速摘要

*   Zero or more, greedy
*?  Zero or more, reluctant
*+  Zero or more, possessive

+   One or more, greedy
+?  One or more, reluctant
++  One or more, possessive

?   Zero or one, greedy
??  Zero or one, reluctant
?+  Zero or one, possessive
Run Code Online (Sandbox Code Playgroud)

注意,不情愿和占有量词也适用于有限重复{n,m}构造.

Java中的示例:

System.out.println("aAoZbAoZc".replaceAll("A.*Z", "!"));  // prints "a!c"
System.out.println("aAoZbAoZc".replaceAll("A.*?Z", "!")); // prints "a!b!c"

System.out.println("xxxxxx".replaceAll("x{3,5}", "Y"));  // prints "Yx"
System.out.println("xxxxxx".replaceAll("x{3,5}?", "Y")); // prints "YY"
Run Code Online (Sandbox Code Playgroud)

  • 这是JavaScript问题和Java!= JavaScript的Java答案.读者,请注意. (2认同)