Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярное выражение (https://javascript.ru/forum/misc/56296-regulyarnoe-vyrazhenie.html)

Decode 09.06.2015 02:46

Регулярное выражение
 
var re = /"(\\.|[^"\\])*?"/i;

console.log( '"Скажи \\"Привет\\"!"'.match(re) );


Я чет не могу понять это регулярное выражение.

Сначала ищется кавычка ("), после кавычки должен быть обратный слэш (\) и любой символ, кроме перевода строки. Или любой символ кроме кавычки (") и слэша (\). И к этой группе добавляется квантификатор (*) - ноль или более символов без жадности. И затем вторая кавычка (").

Что получается? Кавычка совпадает сразу, затем вот это (\\.) отпадает, т.к после кавычки идут буквы. Получается, что регэксп начинает искать (^"\\)*?. А в середине строки встречаются слэши (\). Получается, что должно быть только совпадение подстроки "!"? Но почему то совпадает вся строка.

sogoodweather 09.06.2015 04:26

Действия нашей машины. Прошли ", далее, все символы, включая пробел из <Cкажи >удовлетворяет <[^"\\]>. Далее. подстрока <\\"> удовлетворяет <\\.>(обратный слэш и любой символ кроме перевода строки). C <Привет> то же самое что и с <Скажи >. <\\"> -- см выше. <!> попадает под <[^"\\]> дальше совпадения для <\\.|[^"\\]> заканчиваются. Последний символ <"> попадает под <">.

Вроде как-то так. Ограничитель ? выглядит как лишний. Модификатор i -- точно лишний.

sogoodweather 09.06.2015 05:38

Цитата:

Сообщение от Rise
два обратных слэша в строке это один символ

в выполненой строке. Это в данном случае не имеет значения, так как шаблон регулярного выражения применяется к изначальной строке, а не к ее отображению. /\\/ будет парсить "\\"

sogoodweather 09.06.2015 05:44

alert(
 "****\\****".match(/\\/)[0]
)

sogoodweather 09.06.2015 06:38

Rise,
Чему Вы тут удивляетесь? Я не понял. Все правильно выводится. Выражение /\\\*/ означает <обратный слеш звездочка>

sogoodweather 09.06.2015 07:13

Цитата:

так три же слэша нарисовано и звездочка
Rise,
Я бы Вам посоветовал прочитать что-нибудь по основам регулярных выражений. Бэкслеш перед метасимволом означает "интерпретировать метасимвол как обычный символ"

sogoodweather 09.06.2015 07:17

Цитата:

Сообщение от Rise
А на это что скажешь /\\{2}/ <обратный слеш дважды> в строке два слэша а не находит ?!

в строке один слеш. Вы путаете исходник строки с отображением строки. Странно, что вы не удивляетесь, что, например \n не отображается в алерте. Последний раз повторяю: шаблоны регулярных выражений совпадают с исходником строки, а не с ее отображением на уровне UI

sogoodweather 09.06.2015 07:30

Цитата:

Сообщение от Rise
Смотри пост 3, дошло до тебя

Чесно говоря, до меня не дошло ни то, что до меня должно было дойти, ни то, к чему вообще был этот 3 пост, какое он имеет отношение к сабжу

Decode 09.06.2015 16:47

Цитата:

Сообщение от sogoodweather (Сообщение 374392)
Прошли ", далее, все символы, включая пробел из <Cкажи >удовлетворяет <[^"\\]>.

Согласен с этим.

Цитата:

Сообщение от sogoodweather (Сообщение 374392)
Далее. подстрока <\\"> удовлетворяет <\\.>(обратный слэш и любой символ кроме перевода строки).

О как?

Альтернативы обрабатываются слева направо до тех пор, пока не будет найдено соответствие.

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

sogoodweather 09.06.2015 18:41

Decode,
Я не совсем понял, о чем вы говорите. Суть в том, что все подстроки между кавычками в вашей строке подпадают под шаблон <\\.|[^"\\]>, кавычки, соответственно, подпадают под шаблоны кавычек. Это ответ на ваш вопрос. Я все пошагово расписал, перечитате мой первый пост еще раз.

sogoodweather 09.06.2015 19:26

Цитата:

Сообщение от Decode
Альтернативы обрабатываются слева направо до тех пор, пока не будет найдено соответствие.

Все верно. В вашем случае, когда машина доходит до \\" она проверяет первую альтернативу <\\.> она совпадает, остальное не проверяется, осуществляется переход к следующей позиции строки.

Decode 09.06.2015 19:47

sogoodweather, дак первая кавычка найдется сразу, затем первая альтернатива не совпадет, он переключится на вторую. Совпадение будет таким: "Скажи . Но потом идет слэш, а во второй альтернативе его не должно быть. Не совпадает. Дальше он так же должен пропустить "Привет, т.к. после него идет слэш. Получается, что в этой строке должна совпасть только подстрока "!".

sogoodweather 09.06.2015 20:52

Decode,
давайте еще раз, пошагово.
1 Кавычка совпала с шаблоном кавычки; переместились на следующую позицию; терерь у нас должно бытьсовпадение с шаблоном <\\.|[^"\\]> 0 или более раз.
2 Проверяем от текущей позиции (смотрим вперед). сопоставляем с первой веткой -- проверка провалилась. со второй веткой. Символ C соответствует второй ветке. Значит прибавляем C к уже найденному, перемещаемся на следующую позицию.

Шаг 2 повторяется до позиции перед \\" заглядываем вперед. \\" соответствует первой ветке. перемещаемся на позицию перед П. далее повторяется шаг 2 до позиции перед \\". подстрока \\" проходит по первой ветке условия. далее -- ! проходит по второй ветке. Далее сопоставление проваливается, переходим к следующему шаблону регулярки " ;сопоставление проходит, конец матчинга, бинго.

sogoodweather 09.06.2015 21:55

Rise,
Да, я забыл про ограничение. Но это сути поиска в данном случае не меняет, просто добавляет лишнюю проверку.


Часовой пояс GMT +3, время: 17:11.