如何使正则expression式变为非贪婪?

我正在使用jQuery。 我有一个特殊字符块(开始和结束)的string。 我想从特殊字符块中获取文本。 我使用了一个正则expression式对象来查找string。 但是我怎么能告诉jQueryfind多个结果时,有两个特殊字符或更多?

我的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> 

和我的JavaScript代码:

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

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


在互联网上search信息之后,我刚刚完成了我的工作^^。 我做这样的代码:

 var filterdata = takedata.match(/(\[.*?\])/g); 
  • 我的结果是: [|cơthử|nghiệm|],[| test2 |đàllàtestlần2 |]这是正确的! 但是我不太明白这一点。 你能回答我的原因吗?

非贪婪的正则expression式修饰符就像它们的贪婪反配件,但是有一个? 紧随其后:

 * - zero or more *? - zero or more (non-greedy) + - one or more +? - one or more (non-greedy) ? - zero or one ?? - zero or one (non-greedy) 

你是对的,贪婪是一个问题:

 --A--Z--A--Z-- ^^^^^^^^^^ A.*Z 

如果你想匹配两个A--Z ,你将不得不使用A.*?Z?使* “不情愿”,或懒惰)。

有时候有更好的方法来做到这一点,例如

 A[^Z]*+Z 

这使用否定字符类和占有量词,减less回溯,并可能更有效率。

在你的情况下,正则expression式是:

 /(\[[^\]]++\])/ 

不幸的是 Javascript的正则expression式不支持所有格量​​词,所以你只需要做:

 /(\[[^\]]+\])/ 

也可以看看

  • regular-expressions.info/Repetition
    • 见: 懒惰的一种select
      • 拥有量词
    • 口味比较

快速总结

 * 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 

请注意,不情愿和占有量词也适用于有限重复{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" 

我相信会是这样的

 takedata.match(/(\[.+\])/g); 

最后的g意味着全局,所以在第一场比赛中不会停止。