Я использую 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);
Нежадные модификаторы регулярных выражений похожи на их жадные аналоги, но с ?
сразу после них:
* - 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
( ?
делает *
«неохотным» или ленивым).
Иногда есть более эффективные способы сделать это, например,
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"
Я считаю, что это будет примерно так
takedata.match(/(\[.+\])/g);
g
в конце означает глобальный, поэтому он не останавливается на первом совпадении.