2015-09-14 2 views
-2

Я получаю строку, содержащую строки новой строки (/ n), вкладки (/ t) и строчные буквы [a-z]. Это можно сделать, сопоставив /\n|\t/. AFAIK точка представляет собой подстановочный знак.Регулярное выражение в JS: \. не соответствует n

Поэтому мне было интересно, почему /\n|\t/ не соответствует одно и то же, как /\\./

var text = 'test1 \ntest2'; 

text.split(/\n/)  //['test1', 'test2'] 
text.split(/\./)  //['test1 \ntest2'] 
text.split(/\\./) //['test1 \ntest2'] 

Если не \\. соответствует \n (перевод строки)?

+0

Зачем ему не возвращать null? '\ n' - это один символ, а не символ \, а затем' n' – anubhava

+1

'/\\./' соответствует обратную косую черту, за которой следует символ без символа новой строки. '/\./' соответствует буквенному '.'. – melpomene

+1

@Moezalez Почему? Строка ввода не содержит обратную косую черту. – melpomene

ответ

3

Позвольте мне попытаться ответить на все вопросы:

AFAIK точки представляет собой групповой символ.

Нет, в regex мы не используем термин «подстановочный знак». Это special regex (meta)character. Точка в регулярном выражении JavaScript соответствует любому символу, но символу новой строки.

мне было интересно, почему /\n|\t/ не соответствуют тем же вещам, /\\./

Потому что /\n|\t/ матчей 1 символа, либо символа новой строки или табуляции, в то время как регулярное выражение /\\./ буквального \ и характер кроме новой строки.

\n и \t являются escape-последовательности. Это означает, что \ не является буквальным обратным слэшем, который вместе со следующим символом образует блок кода, строку, которая не может быть записана иначе. Действительно, как мы можем написать разрыв строки на бумаге с помощью пера? Ни за что!

Подробнее о JavaScript character escape sequences here.

Теперь

text.split(/\n/) //['test1', 'test2']

Правда, ваша строка ввода содержит разрыв строки, таким образом, вы получите два элемента в результирующем массиве

text.split(/\./) //['test1 \ntest2']

Ничего не найдено, потому что \. соответствует буквальной точке. Точка, которая сбежала (которая имеет буквальный \ перед ней) в регулярном выражении перестает быть специальным метасимволом регулярного выражения и просто соответствует его буквальному представлению. Ваша строка не имеет точки, поэтому совпадений нет.

text.split(/\\./) //['test1 \ntest2']

Опять совпадение не найдено, а /\\./ ищет буквальном \ следуют любой символ, кроме символа новой строки.

Подсказка: используйте ваши выражения в regex101.com, она сообщит вам, что ваше регулярное выражение может совпадать справа.

Здесь, с регулярным выражением, у вас есть буквальная нотация (/.../). В буквальной нотации \ считается литералом, таким образом, вам не нужно избегать его дважды. Если вы использовали нотацию конструктора (т. Е. RegExp(....)), вам придется использовать двойное экранирование. Например.

var re = /\\./; // is equal to 
var re = new RegExp("\\\\."); 

Подробнее о конструкторских и литературных обозначениях на MDN RegExp help page.

0

\n оценивается по новой строке, поэтому вы по существу сопоставляетесь с пустой строкой. Если вы сделаете быстрый console.log('\n');, вы можете увидеть результат этого.

Смежные вопросы