首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让正则表达式变得非贪婪?

如何让正则表达式变得非贪婪?
EN

Stack Overflow用户
提问于 2010-05-13 11:46:31
回答 3查看 129.6K关注 0票数 261

我使用的是jQuery。我有一个包含特殊字符(begin和end)块的字符串。我想要从那个特殊字符块中获取文本。我使用正则表达式对象进行字符串内查找。但是,当有两个或更多特殊字符时,如何告诉jQuery查找多个结果呢?

我的HTML:

代码语言:javascript
复制
<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代码:

代码语言: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 | 2|đ­y làtest lần 2| chứng khoán |Mỹ|day la nuoc My |test2。但这不是我想要的结果:(。如何获取时间1的文本和时间2的演示?

我刚刚在网上搜索了信息后完成了工作^^。我的代码是这样的:

代码语言:javascript
复制
var filterdata = takedata.match(/(\[.*?\])/g);

我的结果是:|cơthử|nghiệm|,|đ2|ơ?y làửlện 2|đisầ!但我真的不太明白这一点。你能回答我为什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-13 11:50:26

非贪婪的正则表达式修饰符就像它们的贪婪的对应物,但后面紧跟着一个?

代码语言:javascript
复制
*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)
票数 556
EN

Stack Overflow用户

发布于 2010-05-13 12:00:13

你说得对,贪婪是个问题:

代码语言:javascript
复制
--A--Z--A--Z--
  ^^^^^^^^^^
     A.*Z

如果想同时匹配两个A--Z,就必须使用A.*?Z ( ?使*变得“不情愿”或懒惰)。

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

代码语言:javascript
复制
A[^Z]*+Z

这使用了否定的字符类和所有格量词,以减少回溯,并且可能更有效。

在您的示例中,正则表达式为:

代码语言:javascript
复制
/(\[[^\]]++\])/

不幸的是, Javascript regex不支持所有格限定符,所以你只能这样做:

代码语言:javascript
复制
/(\[[^\]]+\])/

另请参阅

懒惰的替代方案请参阅: An Alternative to

代码语言:javascript
复制
- [Flavors comparison](http://www.regular-expressions.info/refflavors.html)

快速总结

代码语言: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中的示例:

代码语言:javascript
复制
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"
票数 40
EN

Stack Overflow用户

发布于 2010-05-13 11:52:16

我相信会是这样的

代码语言:javascript
复制
takedata.match(/(\[.+\])/g);

末尾的g表示全局,因此它不会在第一次匹配时停止。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2824302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档