代码之家  ›  专栏  ›  技术社区  ›  Dave Sag

用于筛选Unicode\\u样式字符的正则表达式[重复]

  •  0
  • Dave Sag  · 技术社区  · 6 年前

    在下面的正则表达式中, \s 表示空格字符。我想象regex解析器正在遍历字符串并看到 \ 知道下一个角色很特别。

    但情况并非如此,因为需要两次越狱。

    为什么会这样?

    var res = new RegExp('(\\s|^)' + foo).test(moo);
    

    有没有一个具体的例子可以说明一个逃逸是如何被错误地理解为其他东西的?

    0 回复  |  直到 6 年前
        1
  •  35
  •   Quentin    5 年前

    通过向regexp构造函数传递字符串来构造正则表达式。

    \ 是字符串文本中的转义字符。

    这个 \ 由字符串文本解析使用

    const foo = "foo";
    const string = '(\s|^)' + foo;
    console.log(string);

    因此,传递给regex编译器的数据是一个简单的 s 而不是 \s .

    你需要逃离 \ 表达 \ 作为数据而不是转义字符本身。

        2
  •  16
  •   Joe Enos    11 年前

    在创建字符串的代码中,反斜杠首先是javascript转义字符,这意味着转义序列如下 \t , \n , \" ,等将被转换为它们的javascript对应项(tab、换行符、引号等),并成为字符串的一部分。双反斜杠表示实际字符串本身中的一个反斜杠,因此,如果要在字符串中使用反斜杠,请先对其进行转义。

    所以当你通过说 var someString = '(\\s|^)' ,您真正要做的是使用 (\s|^) .

        3
  •  7
  •   Wiktor Stribiżew    8 年前

    regex需要一个字符串表示 \s ,在javascript中可以使用 "\\s" .

    下面是一个实例来说明为什么 "\s" 还不够:

    alert("One backslash:          \s\nDouble backslashes: \\s");

    注意一个额外的 \ 之前 的S 更改输出。

        4
  •  6
  •   schlicht    11 年前

    \在字符串中用于转义特殊字符。如果要在字符串中使用反斜杠(例如,对于in\s),则必须通过反斜杠将其转义。所以\变成了。

    编辑:甚至不得不在这里这么做,因为在我的回答中,\。

        5
  •  3
  •   CertainPerformance    6 年前

    如前所述,在字符串文字中,反斜杠表示转义序列,而不是文字反斜杠字符,但是regexp构造函数通常需要在传递给它的字符串中使用文字反斜杠字符,因此代码应该 \\ s表示文字反斜杠, 在大多数情况下 .

    一个问题是,双转义元字符是乏味的。有一种方法可以将字符串传递给 new RegExp 不用双重逃避:使用 String.raw template tag是一个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!

    因此,如果希望保持代码可读,并且有许多反斜杠,可以使用 原始的 仅键入 反斜杠,当模式需要反斜杠时:

    const sentence = 'foo bar baz';
    const regex = new RegExp(String.raw`\bfoo\sbar\sbaz\b`);
    console.log(regex.test(sentence));

    但有更好的选择。 一般来说,没有太多好的理由 新古典主义 除非需要从现有变量动态创建正则表达式。否则,应该改用regex文本,它不需要元字符的双转义,也不需要写出 原始的 要保持模式可读:

    const sentence = 'foo bar baz';
    const regex = /\bfoo\sbar\sbaz\b/;
    console.log(regex.test(sentence));

    最好只使用 新正则表达式 当必须动态创建模式时,如以下代码片段中所示:

    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));