如何使正则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
- 拥有量词
 
- 口味比较
 
-  见: 懒惰的另一种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意味着全局,所以在第一场比赛中不会停止。