我用的是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ử| nghim |] th得胜trường [|test2|đây là test ln 2|] chcgng khoán [| m| day la nuoc My |]。但这不是我想要的结果:(。如何获得[文本]为时间1和[演示]为时间2 ?


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

var filterdata = takedata.match(/(\[.*?\])/g);

我的结果是:[c |ơthử| nghiệm |], [| test2 |đay拉测试lần 2 |) 这是对的!但我不太明白。你能告诉我为什么吗?


非贪婪的正则表达式修饰符就像他们贪婪的对应部分,但有一个?紧接着是:

*  - 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 (the ?使*“不情愿”,或懒惰)。

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

A[^Z]*+Z

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

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

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

不幸的是Javascript regex不支持所有格量词,所以你只需要做:

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

另请参阅

regular-expressions.info /重复 参见:懒惰的替代品 占有欲强的量词 口味比较


快速的总结

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