Как сделать регулярное выражение не жадный?

Я использую 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|] Тхи trường [|test2 на тест|đây Ла lần 2|] chứng khoán [|Mỹ / day la nuoc my|] . Но это не тот результат, который я хочу : (. Как получить [текст] для раз 1 и [демо] для раз 2 ?


Я только что сделал свою работу после поиска информации в интернете ^^. Я делаю код следующим образом:

var filterdata = takedata.match(/([.*?])/g);
  • мой результат : [|cơ thử|nghiệm|], [|test2|đây là test L 2n 2/] это правильно!. но я этого не понимаю. Можешь ответить почему?

3 ответов


не-жадные модификаторы регулярных выражений похожи на их жадные встречные части, но с ? сразу после них:

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

вы правы, что жадность-это проблема:

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

если вы хотите, чтобы соответствовать как A--Z, вам придется использовать A.*?Z (the ? делает * "неохота", или ленивый).

иногда есть лучшие способы сделать это, хотя, например

A[^Z]*+Z

это использует отрицаемый класс символов и притяжательный Квантор, чтобы уменьшить обратное отслеживание и, вероятно, будет более эффективным.

в вашем случае, регекс быть:

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

к сожалению Javascript regex не поддерживает притяжательный Квантор, поэтому вам просто нужно сделать с:

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

см. также


краткий обзор

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

Я считаю, что это было бы так

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

на g в конце означает глобальный, поэтому он не останавливается на первом матче.