在JavaScript中,我们有时会编写正则表达式,如:
var re = /ab+c/;
var re = /^ab+c$/;
var re = new RegExp("ab+c");
他们之间有什么区别?哪一个更好?
答案 0 :(得分:2)
你在这里有两个不同的问题。
^
在正则表达式开始时的含义以及$
在结尾处的含义是什么?
这些匹配字符串的开头和结尾。 /a/
将匹配"ba"
,/^a/
则不匹配,且两者都匹配"ba"
。
//
和new RegExp()
有什么区别?
一个是文字,另一个是通过转换字符串创建的。
通常,使用文字更简单,更快速,更清晰,是首选。使用字符串意味着您必须担心为正则表达式和包含它的字符串转义字符,但它还允许您动态构建正则表达式(例如,来自用户输入的字符串)。
答案 1 :(得分:1)
var re = /ab+c/;
将匹配a
,然后是字符串中任意位置的b
s,然后是c
的序列。
var re = /^ab+c$/;
将匹配a
,然后匹配b
s的序列,然后匹配c
,但前提是它是整个字符串。 ^
和$
分别表示字符串的开头和结尾。
var re = new RegExp("ab+c");
相当于第一个正则表达式。
var re = new RegExp("^ab+c$");
也是可能的,相当于第二个正则表达式。
至于哪一个更好:正则表达式文字/.../
通常更短且更易读,但在某些情况下,正则表达式构造函数RegExp(...)
可能更合适:
new RegExp(...)
可能更具可读性。答案 2 :(得分:1)
在某些情况下,这些选项有所不同:
找到表达式abc或abbc或(a和一个或多个b和一个c在所有行中)。 这样就可以在所有字符串中使用表达式:
"abc", "abbbbbbbbc" yes
"myabc", "myabbbbbbbbc" yes
"abcismine", "abbbbbbbbcismine" yes
"myabcismine", "myabbbbbbbbcismine" yes
Almos的表情相同,但只发现了表达。 ^ char分隔行的开头,$ char删除行的结尾。
这就是字符串中的表达式:
"abc", "abbbbbbbbc" yes
"myabc", "myabbbbbbbbc" no
"abcismine", "abbbbbbbbcismine" no
"myabcismine", "myabbbbbbbbcismine" no
答案 3 :(得分:0)
1和3之间没有区别,但2完全是不同的正则表达式。数字2是不同的,因为^
匹配一行的开头而$
标记行的结尾。因此,虽然1和3匹配“_abbc1”中的“abbc”,但第二个只匹配“abbc”(如果它在自己的行上)(基本上,它夹在换行符之间)。
你只是在1中使用文字语法并使用3的构造函数。不同于字符串的区别(其中typeof为文字“abc”返回的内容不同于new String(abc)
),没有除了实现细节之外,使用正则表达式的文字的真正区别。
要深入了解1到3之间的差异,可以查看MDN Javascript Guide > Regular Expressions。基本上,文字是编译的,当你提前知道模式是什么时(例如在你的例子中),你应该使用它。在运行时动态构造模式时(例如基于用户输入时),应使用对象语法:
您可以通过以下两种方式之一构建正则表达式:
使用正则表达式文字,如下所示:
var re = /ab+c/;
正则表达式文字在评估脚本时提供正则表达式的编译。当正则表达式保持不变时,请使用它以获得更好的性能。
调用RegExp对象的构造函数,如下所示:
var re = new RegExp("ab+c");
使用构造函数提供正则表达式的运行时编译。当您知道正则表达式模式将要更改时,或者您不知道该模式并从其他源(例如用户输入)获取该模式时,请使用构造函数。