Как сделать регулярное выражение неживым?
Я использую 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 | | | | | | | | | | | | | | | | Но это не результат, который я хочу:( Как получить [текст] для времен 1 и [demo] для времен 2?
Я только что сделал свою работу после поиска информации в Интернете ^^. Я делаю код следующим образом:
var filterdata = takedata.match(/(\[.*?\])/g);
- мой результат: [| cơ thử | nghiệm |], [| test2 | đây là test lần 2 |]
это правильно!. но я этого не понимаю. Можете ли вы ответить на мой вопрос?
Ответы
Ответ 1
Нежелательные модификаторы регулярных выражений похожи на их жадные контр-части, но с ?
, следующие за ними:
* - zero or more
*? - zero or more (non-greedy)
+ - one or more
+? - one or more (non-greedy)
? - zero or one
?? - zero or one (non-greedy)
Ответ 2
Вы правы, что жадность является проблемой:
--A--Z--A--Z--
^^^^^^^^^^
A.*Z
Если вы хотите совместить оба A--Z
, вам нужно будет использовать A.*?Z
(?
делает *
"неохотным" или ленивым).
Иногда существуют более эффективные способы сделать это, например,
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"
Ответ 3
Я считаю, что это будет так.
takedata.match(/(\[.+\])/g);
g
в конце означает глобальный, поэтому он не останавливается в первом совпадении.