如何使正则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
意味着全局,所以在第一场比赛中不会停止。