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


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