如何在JavaScript中将长的正则表达式拆分成多行?

194
我有一个非常长的正则表达式,我希望将它拆分为多行以便于阅读。 我想让每行代码长度在80个字符以内,符合JSLint规则。以下是样例模式:
var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

5
看起来你正在(尝试)验证电子邮件地址。为什么不直接使用 /\S+@\S+\.\S+/ - Bart Kiers
1
你应该尝试找到一种无需正则表达式或使用多个较小的正则表达式来实现它的方法。这比一个很长的正则表达式更易读。如果你的正则表达式超过约20个字符,那么可能有更好的方法来实现它。 - ForbesLindesay
2
现在宽屏幕普及,80个字符不是有点过时了吗? - Oleg V. Volkov
9
@OlegV.Volkov 不行。一个人可能会在vim中使用分割窗口,在服务器机房中使用虚拟终端。假设每个人都会在与你相同的视口中编码是错误的。此外,将行限制为80个字符会强迫你将代码分解为更小的函数。 - synic
我当然理解你想在这里这样做的动机 - 当这个正则表达式被分成多行,就像Koolilnc所演示的那样,它立即成为可读性强、自我记录的代码的完美例子。 ¬_¬ - Mark Amery
@OlegV.Volkov,将宽屏幕分成几个窗口仍然是非常方便的。例如,在一个窗口中您可以使用文本编辑器,在另一个窗口中运行单元测试。 - Dmitry Koroliov
11个回答

1

@Hashbrown的优秀答案让我走上了正确的道路。这是我的版本,也受到了这个博客的启发。

function regexp(...args) {
  function cleanup(string) {
    // remove whitespace, single and multi-line comments
    return string.replace(/\s+|\/\/.*|\/\*[\s\S]*?\*\//g, '');
  }

  function escape(string) {
    // escape regular expression
    return string.replace(/[-.*+?^${}()|[\]\\]/g, '\\$&');
  }

  function create(flags, strings, ...values) {
    let pattern = '';
    for (let i = 0; i < values.length; ++i) {
      pattern += cleanup(strings.raw[i]);  // strings are cleaned up
      pattern += escape(values[i]);        // values are escaped
    }
    pattern += cleanup(strings.raw[values.length]);
    return RegExp(pattern, flags);
  }

  if (Array.isArray(args[0])) {
    // used as a template tag (no flags)
    return create('', ...args);
  }

  // used as a function (with flags)
  return create.bind(void 0, args[0]);
}

像这样使用它:
regexp('i')`
  //so this is a regex

  //here I am matching some numbers
  (\d+)

  //Oh! See how I didn't need to double backslash that \d?
  ([a-z]{1,3}) /*note to self, this is group #2*/
`

创建此RegExp对象的方法如下:
/(\d+)([a-z]{1,3})/i

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接