Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.06.2015, 02:46
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

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

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


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

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

Что получается? Кавычка совпадает сразу, затем вот это (\\.) отпадает, т.к после кавычки идут буквы. Получается, что регэксп начинает искать (^"\\)*?. А в середине строки встречаются слэши (\). Получается, что должно быть только совпадение подстроки "!"? Но почему то совпадает вся строка.
Ответить с цитированием
  #2 (permalink)  
Старый 09.06.2015, 04:26
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

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

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

Последний раз редактировалось sogoodweather, 09.06.2015 в 05:55.
Ответить с цитированием
  #3 (permalink)  
Старый 09.06.2015, 05:38
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

Сообщение от Rise
два обратных слэша в строке это один символ
в выполненой строке. Это в данном случае не имеет значения, так как шаблон регулярного выражения применяется к изначальной строке, а не к ее отображению. /\\/ будет парсить "\\"
Ответить с цитированием
  #4 (permalink)  
Старый 09.06.2015, 05:44
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

alert(
 "****\\****".match(/\\/)[0]
)
Ответить с цитированием
  #5 (permalink)  
Старый 09.06.2015, 06:38
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

Rise,
Чему Вы тут удивляетесь? Я не понял. Все правильно выводится. Выражение /\\\*/ означает <обратный слеш звездочка>
Ответить с цитированием
  #6 (permalink)  
Старый 09.06.2015, 07:13
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

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

Последний раз редактировалось sogoodweather, 09.06.2015 в 07:19.
Ответить с цитированием
  #7 (permalink)  
Старый 09.06.2015, 07:17
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

Сообщение от Rise
А на это что скажешь /\\{2}/ <обратный слеш дважды> в строке два слэша а не находит ?!
в строке один слеш. Вы путаете исходник строки с отображением строки. Странно, что вы не удивляетесь, что, например \n не отображается в алерте. Последний раз повторяю: шаблоны регулярных выражений совпадают с исходником строки, а не с ее отображением на уровне UI
Ответить с цитированием
  #8 (permalink)  
Старый 09.06.2015, 07:30
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

Сообщение от Rise
Смотри пост 3, дошло до тебя
Чесно говоря, до меня не дошло ни то, что до меня должно было дойти, ни то, к чему вообще был этот 3 пост, какое он имеет отношение к сабжу
Ответить с цитированием
  #9 (permalink)  
Старый 09.06.2015, 16:47
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

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

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

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

Изначально была найдена кавычка, а левая альтернатива не совпала ни с чем, т.к. после кавычки идут буквы.
Ответить с цитированием
  #10 (permalink)  
Старый 09.06.2015, 18:41
Интересующийся
Посмотреть профиль Найти все сообщения от sogoodweather
 
Регистрация: 09.06.2015
Сообщений: 26

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярное выражение tata4ka Общие вопросы Javascript 4 15.11.2014 00:56
Регулярное выражение и метод test tsigel Общие вопросы Javascript 3 30.08.2013 13:47
регулярное выражение literator Ваши сайты и скрипты 1 18.08.2013 18:24
Регулярное выражение: любой символ, включая перевод строки Gleb Общие вопросы Javascript 3 28.07.2011 12:15
регулярное выражение theo_ Общие вопросы Javascript 15 21.06.2010 10:29