12

我正在研究一个特殊的正则表达式来匹配一个 javascript 正则表达式。

现在我有这个正则表达式工作:

/\/(.*)?\/([i|g|m]+)?/

例如:

'/^foo/'.match(/\/(.*)?\/([i|g|m]+)?/) => ["/^foo/", "^foo", undefined]
'/^foo/i'.match(/\/(.*)?\/([i|g|m]+)?/) => ["/^foo/i", "^foo", "i"]

现在我需要让这个正则表达式使用:

'^foo'.match(/\/(.*)?\/([i|g|m]+)?/) => ["^foo", "^foo", undefined]

不幸的是,我以前的正则表达式不适用于那个。

有人可以帮我找到与此示例匹配的正则表达式(以及其他示例):

'^foo'.match([a regex]) => ["^foo", "^foo", undefined]
4

1 回答 1

22

匹配正则表达式的正则表达式是

/\/((?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+)\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/

为了打破它,

  1. \/匹配文字/
  2. (?![*+?])是必要/*的,因为开始注释,而不是正则表达式。
  3. [^\r\n\[/\\]匹配任何非转义序列字符和非字符组的开始
  4. \[...\]匹配可以包含未转义的字符组/
  5. \\.匹配转义序列的前缀
  6. +是必要的,因为//它是行注释,而不是正则表达式。
  7. (?:g...)?匹配非重复正则表达式标志的任意组合。这么难看。

这不会尝试配对括号,或检查重复修饰符是否未应用于自身,而是过滤掉正则表达式无法进行语法检查的大多数其他方式。

如果您需要一个只与身体相匹配的,只需剥离其他所有内容:

/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+/

或者,"/"在输入的开头和结尾添加。

于 2013-07-24T20:01:43.830 回答