Как сделать регулярное выражение не жадный?
Я использую 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 Хоан [|Mỹ / day la nuoc my|] . Но это не тот результат, который я хочу : (. Как получить [текст] для раз 1 и [демо] для раз 2 ?
Я только что сделал свою работу после поиска информации в интернете ^^. Я делаю такой код:
var filterdata = takedata.match(/([.*?])/g);
- мой результат : [|cơ thử / nghiệm|], [|test2|đây là test lần 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 не поддерживает притяжательный Квантор, поэтому вам просто нужно сделать:
/(\[[^\]]+\])/
см. также
- regular-expressions.info/Repetition
- посмотреть: альтернатива лень
- ароматы сравнение
краткий обзор
* 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"