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

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


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

var filterdata = takedata.match(/(\[.*?\])/g);
  • мой результат: [|cơ thử | nghiệm |], [| тестовый lần 2 test2 |đây là |] это правильно!. но я действительно не понимаю это. Можно ли ответить на мой почему?
206
задан ROMANIA_engineer 23 July 2017 в 10:31
поделиться

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)
448
ответ дан 23 November 2019 в 04:46
поделиться

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

--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"
35
ответ дан 23 November 2019 в 04:46
поделиться

Я считаю, что это будет примерно так

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

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

3
ответ дан 23 November 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: