代码之家  ›  专栏  ›  技术社区  ›  temporary_user_name

如何在regex中放置换行符以使其更具可读性?[复制品]

  •  3
  • temporary_user_name  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有一封很长的电子邮件,与javascript中的regex匹配,我希望在不更改regex功能的情况下将其分成多行。我知道一些regex引擎提供了一种插入换行以提高可读性的方法,在JS中有这样的方法吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   CertainPerformance    6 年前

    没有 内置的 完成这样一件事的方法,但你自己并不难。可以将模板文本用于 String.raw ,这将允许您在regex字符串中使用换行符, 不必重复使用反斜杠 ,然后可以将所有换行符替换为空字符串,然后再将其传递给 new RegExp 以下内容:

    const patternStr = String.raw`^
    [fg]oo
    =
    \war`;
    const pattern = new RegExp(patternStr.replace(/\n/g, ''));
    console.log(pattern.test('foo=bar'));
    console.log(pattern.test('goo=bar'));
    console.log(pattern.test('hoo=bar'));

    您也可以使用类似的技术来允许注释:

    const patternStr = String.raw`
    ^         // Match the beginning of the string
    [fg]oo    // Match either f or g, followed by oo
    =         // Match an equals sign
    \war      // Match a word character, followed by "ar"
    `;    
    const pattern = new RegExp(
      patternStr.replace(/(?: *\/\/.*)?\n/g, '')
    );
    console.log(pattern.test('foo=bar'));
    console.log(pattern.test('goo=bar'));
    console.log(pattern.test('hoo=bar'));

    这个 (?: *\/\/.*)?\n 模式意味着:

    (?: *\/\/.*)? -由零个或多个空格组成的可选组,后跟 // ,后跟非换行符

    \n -后接换行符

    当然,这意味着它将不可能写 / / 就像在regex中一样,但这没关系,您可以像处理正则表达式文本一样,向前转义斜杠(它将由regexp构造函数作为不必要的转义字符进行解析):

    const patternStr = String.raw`
    ^         // Match the beginning of the string
    \/\/      // Match two literal forward slashes
    `;
    const pattern = new RegExp(
      patternStr.replace(/(?: *\/\/.*)?\n/g, '')
    );
    console.log(pattern.test('//foo'));
    console.log(pattern.test('foo'));

    另一种方法是允许文字 / / 与注释匹配时,模板文本中的 // <text> \n ,确保 <text> 没有 / / 在里面。这意味着只有 最终的 / / 一行将被解析为注释,允许您使用 / / 在线路上,没有逃逸,没有问题,通过使用 (?:(?!\/\/).)* 而不是 .* :

    const patternStr = String.raw`
    ^         // Match the beginning of the string
    //        // Match two literal forward slashes
    `;
    const pattern = new RegExp(
      patternStr.replace(/(?: *\/\/(?:(?!\/\/).)*)?\n/g, '')
    );
    console.log(pattern.test('//foo'));
    console.log(pattern.test('foo'));

    当然,这意味着 / / 如果存在 另一个 / / 再往前一点。(如果没有别的 / / 以后,你得用 \/\/ 相反)