我收到一个包含换行符(/ n),制表符(/ t)和小写字母[a-z]的字符串。可以通过匹配/\n|\t/
来实现。 AFAIK点代表通配符。
因此我想知道为什么/\n|\t/
与/\\./
var text = 'test1 \ntest2';
text.split(/\n/) //['test1', 'test2']
text.split(/\./) //['test1 \ntest2']
text.split(/\\./) //['test1 \ntest2']
\\.
是否应该与\n
(换行符)匹配?
答案 0 :(得分:3)
让我试着回答所有问题:
AFAIK点代表通配符。
不,在正则表达式中,我们不使用术语"通配符"。这是一个special regex (meta)character。 JavaScript正则表达式中的一个点匹配任何字符,但是换行符。
我很想知道为什么
相同的内容不匹配/\n|\t/
与/\\./
因为/\n|\t/
匹配1个符号(换行符或制表符),而正则表达式/\\./
匹配文字\
和换行符以外的字符。
\n
和\t
是转义序列。这意味着\
不是一个字面反斜杠,它与下面的符号一起形成一个代码单元,一个不能以其他方式写入的字符串。实际上,我们如何用笔在纸上写下换行符?没办法!
详细了解JavaScript character escape sequences here。
现在,
text.split(/\n/) //['test1', 'test2']
是的,您的输入字符串包含换行符,因此,您在结果数组中得到两个元素
text.split(/\./) //['test1 \ntest2']
找不到匹配项,因为\.
与文字点匹配。在正则表达式中转义的点(在它之前有文字\
)停止是一个特殊的正则表达式元字符,并且只匹配其文字表示。你的字符串没有点,因此没有匹配。
text.split(/\\./) //['test1 \ntest2']
同样,找不到匹配项,因为/\\./
会查找文字\
,后跟任何字符,但换行符。
提示:在regex101.com使用您的表达式,它会告诉您正则表达式在右侧可以匹配的内容。
在这里,使用正则表达式,您有一个文字符号(/.../
)。在字面符号中,\
被认为是文字,因此,您不必两次逃避它。如果您使用构造函数表示法(即RegExp(....)
),则必须使用双重转义。 E.g。
var re = /\\./; // is equal to
var re = new RegExp("\\\\.");
在MDN RegExp
help page查看有关构造函数和文字符号的更多信息。
答案 1 :(得分:0)
\n
被评估为一个新行,所以你基本上匹配一个空字符串。如果你快速console.log('\n');
,你可以看到它的输出。