我正在使用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>
和我的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次?
我在互联网上搜索信息后完成了我的工作^^。我制作这样的代码:
var filterdata = takedata.match(/(\[.*?\])/g);
答案 0 :(得分:427)
非贪婪的正则表达式修饰符就像它们贪婪的反对部分,但紧随其后有一个?
:
* - zero or more
*? - zero or more (non-greedy)
+ - one or more
+? - one or more (non-greedy)
? - zero or one
?? - zero or one (non-greedy)
答案 1 :(得分:32)
你说贪婪是个问题:
--A--Z--A--Z--
^^^^^^^^^^
A.*Z
如果您想同时匹配A--Z
,则必须使用A.*?Z
(?
使*
“不情愿”或懒惰。
但有时候有更好的方法可以做到这一点,例如
A[^Z]*+Z
这使用否定的字符类和占有量词来减少回溯,并且可能更有效率。
在你的情况下,正则表达式将是:
/(\[[^\]]++\])/
很遗憾 Javascript正则表达式不支持占有量词,所以你只需要这样做:
/(\[[^\]]+\])/
* 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"
答案 2 :(得分:3)
我相信会是这样的
takedata.match(/(\[.+\])/g);
最后的g
表示全局,因此它不会在第一场比赛时停止。