Регулярное выражение
var re = /"(\\.|[^"\\])*?"/i; console.log( '"Скажи \\"Привет\\"!"'.match(re) ); Я чет не могу понять это регулярное выражение. Сначала ищется кавычка ("), после кавычки должен быть обратный слэш (\) и любой символ, кроме перевода строки. Или любой символ кроме кавычки (") и слэша (\). И к этой группе добавляется квантификатор (*) - ноль или более символов без жадности. И затем вторая кавычка ("). Что получается? Кавычка совпадает сразу, затем вот это (\\.) отпадает, т.к после кавычки идут буквы. Получается, что регэксп начинает искать (^"\\)*?. А в середине строки встречаются слэши (\). Получается, что должно быть только совпадение подстроки "!"? Но почему то совпадает вся строка. |
Действия нашей машины. Прошли ", далее, все символы, включая пробел из <Cкажи >удовлетворяет <[^"\\]>. Далее. подстрока <\\"> удовлетворяет <\\.>(обратный слэш и любой символ кроме перевода строки). C <Привет> то же самое что и с <Скажи >. <\\"> -- см выше. <!> попадает под <[^"\\]> дальше совпадения для <\\.|[^"\\]> заканчиваются. Последний символ <"> попадает под <">.
Вроде как-то так. Ограничитель ? выглядит как лишний. Модификатор i -- точно лишний. |
Цитата:
|
alert( "****\\****".match(/\\/)[0] ) |
Rise,
Чему Вы тут удивляетесь? Я не понял. Все правильно выводится. Выражение /\\\*/ означает <обратный слеш звездочка> |
Цитата:
Я бы Вам посоветовал прочитать что-нибудь по основам регулярных выражений. Бэкслеш перед метасимволом означает "интерпретировать метасимвол как обычный символ" |
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Альтернативы обрабатываются слева направо до тех пор, пока не будет найдено соответствие. Изначально была найдена кавычка, а левая альтернатива не совпала ни с чем, т.к. после кавычки идут буквы. |
Decode,
Я не совсем понял, о чем вы говорите. Суть в том, что все подстроки между кавычками в вашей строке подпадают под шаблон <\\.|[^"\\]>, кавычки, соответственно, подпадают под шаблоны кавычек. Это ответ на ваш вопрос. Я все пошагово расписал, перечитате мой первый пост еще раз. |
Цитата:
|
sogoodweather, дак первая кавычка найдется сразу, затем первая альтернатива не совпадет, он переключится на вторую. Совпадение будет таким: "Скажи . Но потом идет слэш, а во второй альтернативе его не должно быть. Не совпадает. Дальше он так же должен пропустить "Привет, т.к. после него идет слэш. Получается, что в этой строке должна совпасть только подстрока "!".
|
Decode,
давайте еще раз, пошагово. 1 Кавычка совпала с шаблоном кавычки; переместились на следующую позицию; терерь у нас должно бытьсовпадение с шаблоном <\\.|[^"\\]> 0 или более раз. 2 Проверяем от текущей позиции (смотрим вперед). сопоставляем с первой веткой -- проверка провалилась. со второй веткой. Символ C соответствует второй ветке. Значит прибавляем C к уже найденному, перемещаемся на следующую позицию. Шаг 2 повторяется до позиции перед \\" заглядываем вперед. \\" соответствует первой ветке. перемещаемся на позицию перед П. далее повторяется шаг 2 до позиции перед \\". подстрока \\" проходит по первой ветке условия. далее -- ! проходит по второй ветке. Далее сопоставление проваливается, переходим к следующему шаблону регулярки " ;сопоставление проходит, конец матчинга, бинго. |
Rise,
Да, я забыл про ограничение. Но это сути поиска в данном случае не меняет, просто добавляет лишнюю проверку. |
Часовой пояс GMT +3, время: 17:11. |