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

我用的是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 |đay拉测试lần 2 |] chứng khoan [mỹ| |天la nuoc |)。但这不是我想要的结果:(。如何获得[文本]为时间1和[演示]为时间2 ?


我是在网上查了一下资料才开始工作的^^。我编写的代码是这样的:

var filterdata = takedata.match(/(\[.*?\])/g);
  • 我的结果是:<强> [cơthử| | nghiệm |], [| test2 |đay拉测试lần 2 |) 这是对的!但我不太明白。你能告诉我为什么吗?李< / >
140741 次浏览

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

*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)

我相信会是这样的

takedata.match(/(\[.+\])/g);

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

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

--A--Z--A--Z--
^^^^^^^^^^
A.*Z

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

不过,有时有更好的方法来做到这一点,例如:

A[^Z]*+Z

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

在你的例子中,正则表达式是:

/(\[[^\]]++\])/

不幸的是 Javascript正则表达式不支持所有格量词,所以你只需要做:

/(\[[^\]]+\])/

另请参阅

  • regular-expressions.info/Repetition
    • 参见:懒惰的另一种选择

      快速的总结

      *   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"