为什么regex构造函数需要进行双转义
Why do regex constructors need to be double escaped?
在下面的正则表达式中,'s
表示一个空格字符。我想象regex解析器正在遍历字符串,看到'
,并知道下一个字符是特殊的。
但事实并非如此,因为需要双重转义。
为什么会这样?
var res = new RegExp('(''s|^)' + foo).test(moo);
有没有一个具体的例子可以说明一次逃跑是如何被错误地解释为其他事情的?
通过将字符串传递给RegExp构造函数来构造正则表达式。
'
是字符串文字中的转义字符。
'
被字符串文字解析消耗…
const foo = "foo";
const string = '('s|^)' + foo;
console.log(string);
…所以传递给RegEx编译器的数据是普通的s
,而不是's
。
您需要对'
进行转义,以将'
表示为数据,而不是转义字符本身。
在创建字符串的代码中,反斜杠首先是一个javascript转义符,这意味着像't
、'n
、'"
等转义序列将被翻译成它们的javascript对应字符(tab、换行符、引号等),并成为字符串的一部分。双反斜杠表示实际字符串本身中的一个反斜杠,因此如果您希望字符串中有一个反斜线,请先转义。
因此,当你通过说var someString = '(''s|^)'
生成一个字符串时,你真正要做的是创建一个值为('s|^)
的实际字符串。
Regex需要's
的字符串表示,在JavaScript中可以使用文本"''s"
生成。
以下是一个示例来说明"'s"
不够的原因:
alert("One backslash: 's'nDouble backslashes: ''s");
请注意's
之前的额外'
如何更改输出。
如前所述,在字符串文字中,反斜杠表示转义序列,而不是文字反斜杠字符,但RegExp构造函数在传递给它的字符串中通常需要文字反斜杠,因此代码应该有''
s来表示文字反斜杠(在大多数情况下为)。
一个问题是双转义元字符是乏味的。有一种方法可以将字符串传递给new RegExp
,而不必对其进行双重转义:使用String.raw
模板标记,这是一种ES6功能,允许您编写一个字符串,该字符串将由解释器逐字逐句地解析,而无需对转义序列进行任何解析。例如:
console.log(''''.length); // length 1: an escaped backslash
console.log(`''`.length); // length 1: an escaped backslash
console.log(String.raw`''`.length); // length 2: no escaping in String.raw!
因此,如果您希望保持代码的可读性,并且您有许多反斜杠,那么当模式需要反斜杠时,可以使用String.raw
只键入一个反斜杠:
const sentence = 'foo bar baz';
const regex = new RegExp(String.raw`'bfoo'sbar'sbaz'b`);
console.log(regex.test(sentence));
但还有更好的选择一般来说,除非需要从现有变量中动态创建正则表达式,否则使用new RegExp
的理由并不充分。否则,您应该使用regex文本,它不需要元字符的双重转义,也不需要写出String.raw
来保持模式可读性:
const sentence = 'foo bar baz';
const regex = /'bfoo'sbar'sbaz'b/;
console.log(regex.test(sentence));
最好只在必须动态创建模式时使用new RegExp
,如以下代码段所示:
const sentence = 'foo bar baz';
const wordToFind = 'foo'; // from user input
const regex = new RegExp(String.raw`'b${wordToFind}'b`);
console.log(regex.test(sentence));
''在字符串中用于转义特殊字符。如果你想在字符串中使用反斜杠(例如,对于''in''s),你必须通过反斜杠对其进行转义。所以''变成了''。
编辑:甚至不得不在这里做,因为''''在我的回答中变成了''。
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 在JavaScript中输出转义字符
- 在RegEx(JavaScript)中正确转义变量
- Regex以转义HTML标记
- “转义字符串”在Regex中是什么意思?(Javascript)
- Regex允许某些特殊字符-转义问题
- 为什么RegEx输出转义文本而不是HTML
- 使用Javascript Regex转义Lucene字符
- 为什么regex构造函数需要进行双转义
- 需要Javascript RegEx和转义建议
- Regex模式太长——需要在JavaScript中拆分不带转义字符
- RegEx禁止字符,除非转义
- Javascript regex验证密码字符串(转义标点符号)
- 在RegEx (JS)中转义一些特殊字符
- 转义Regex单引号会在repit上创建额外的反斜杠
- regex转义空格
- 在Javascript中使用regex或indexOf更改字符串中的特定字符(转义字符)
- regex ..如何转义连字符
- Regex禁用转义键
- 带有转义字符的循环变量的Javascript Regex