【问题标题】:How to preserve \ when converting a string to a RegEx将字符串转换为正则表达式时如何保留\
【发布时间】:2019-12-25 03:01:54
【问题描述】:

我有一些通过 JSON 对象传给我的正则表达式,如下所示:

{
  config: { 
    regEx: "/^$/"
  }
}

我正在尝试将上述字符串转换为正则表达式,如下所示:

const re = new RegExp(config.regEx);

这行得通,但RegExp 是~有帮助~ 转义/ 字符并返回//^$//(不是/^$/

如何在不转义 / 的情况下最好地将字符串转换为正则表达式?

编辑:我无法控制返回的原始字符串。就是这样。

【问题讨论】:

  • 修剪那些,RegExp 构造函数假定表达式字面上没有分隔符。所以你需要传递一个"^$" 字符串。
  • 它没有转义/。它不需要:/ 在正则表达式中并不特殊。
  • 正斜杠 / 是该语言的 JavaScript 正则表达式语法的一部分。它不是正则表达式的一部分。您不应该将它存储在您的对象中,或者在构造正则表达式之前将其从字符串中删除。
  • 如果你的正则表达式中有一个/,但你不想匹配文字/,你需要事先去掉那个/
  • 题名看不懂;听起来您在问如何从字符串中删除第一个和最后一个字符,而不是“保留\”?

标签: javascript json regex


【解决方案1】:

转义并不完全是这里发生的事情。

当使用内联定义组成 RegEx 时,通常不可能(没有反斜杠)在表达式的开头包含正斜杠,因为双斜杠会被解释为注释。

let re = //abc/g;

这就是new RegExp() 发挥作用的地方。您可以为函数提供 string,它会将内容封装到 RegEx 中 -- 无需评估内容

所以说真的,您在控制台中看到的不是转义,而是连续出现两种不同类型的斜线:

  1. 表示正则表达式的外斜线,然后
  2. 内斜线是封装字符串的一部分。

没有使用eval(),没有办法使用字符串来定义正则表达式,使斜杠被解释为它的“边界”。 不要使用eval()

获得预期行为的最简单方法是像这样去掉传入字符串的第一个和最后一个字符:

const re = new RegExp(config.regEx.slice(1,-1));

如果你想有条件地修剪斜线,你可以(讽刺地)使用正则表达式:

const TRIM_SLASH = new RegExp('^/(.*)/$');
let stripped = config.regEx.replace(TRIM_SLASH,'$1');
const re = new RegExp(stripped);

【讨论】:

    【解决方案2】:

    只需删除您周围的 / 正则表达式,如下所示:"/^$/" 变为 "^$"

    当不使用正则表达式构造函数时,正则表达式周围的/ 只是告诉javascript(v8)它是一个正则表达式的方法,就像" 告诉javascript 它是一个字符串一样。 (我明白为什么这可能会让您感到困惑,因为/^$/.toString() 导致"/^$/"

    要从字符串中删除/,请执行以下操作:

    config.regEx.replace(/(^\/)|(\/$)/g, '')
    

    【讨论】:

      【解决方案3】:

      模式的存储方式似乎不是为 javascript 设计的,因此您必须提取最终的全局修饰符并删除分隔符:

      let toto = {
        config: { 
          regEx: "/^$/"
        }
      };
      
      let delimiter = toto.config.regEx[0];
      let arr = toto.config.regEx.split(delimiter);
      
      arr.shift();
      
      let modifiers = arr.pop();
      let pattern = arr.join(delimiter);
      
      /* eventually, you need to escape backslashes (depending of how patterns
         are written, if it isn't the case already):
      pattern = pattern.replace(/\\/g, '\\\\'); */
      
      const re = new RegExp(pattern, modifiers);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2022-11-18
        • 1970-01-01
        • 2014-09-22
        • 2021-08-05
        • 2013-06-09
        • 2015-09-09
        相关资源
        最近更新 更多