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

时间:2010-05-13 03:46:31

标签: javascript regex filter expression 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>

和我的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);
  • 我的结果是: [|cơthử|nghiệm|],[| test2 |đâylàtestlần2|] 这是正确的!。但我真的不明白这一点。你能回答我的原因吗?

3 个答案:

答案 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表示全局,因此它不会在第一场比赛时停止。