264

我正在使用 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|đây là test lần 2|] chứng khoán [|Mỹ|day la nuoc my|]。但这不是我想要的结果:(。如何获得时间 1 的 [text] 和时间 2 的 [demo] ?


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

var filterdata = takedata.match(/(\[.*?\])/g);
  • 我的结果是:[|cơ thử|nghiệm|],[|test2|đây là test lần 2|] 这是对的!但我真的不明白这一点。你能回答我为什么吗?
4

3 回答 3

565

非贪婪的正则表达式修饰符就像它们的贪婪对应部分,但?紧随其后:

*  - zero or more
*? - zero or more (non-greedy)
+  - one or more
+? - one or more (non-greedy)
?  - zero or one
?? - zero or one (non-greedy)
于 2010-05-13T03:50:26.407 回答
41

你是对的,贪婪是一个问题:

--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"
于 2010-05-13T04:00:12.807 回答
3

我相信会是这样

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

最后的g意思是全局的,所以它不会在第一场比赛中停止。

于 2010-05-13T03:52:15.793 回答