JavaScript正则表达式匹配另一个正则表达式

14

我正在制作一个特殊的正则表达式来匹配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]

3
你的第一个正则表达式也匹配 /foo/|||,供你参考。 - Sean
我只是以新的方式提出了问题。请看slak的评论... - user3186555
1个回答

24

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

/\/((?![*+?])(?:[^\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\]\\]|\\.)*\])+/

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


40
我不知道这个是否有效,但我知道它让我感到害怕。 - Mark Amery
2
'/foo/i'.match(/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/(?:g(?:im?|m)?|i(?:gm?|m)?|m(?:gi?|i)?)?/) 的结果是 ['/foo/i']。这不是预期的结果。 - julesbou
@jules,我在适当的位置添加了括号,以便匹配具有您期望的位。 - Mike Samuel
4
"x = 2; y = x / 3; z = x/4"。在这种情况下,你的正则表达式将无法工作。 - Gor
1
哦,仔细想想,如果人们想要一个匹配字符串(或其他内容)之后的正则表达式,那么这个 (?:i(?!\w*i)|g(?!\w*g)|m(?!\w*m))*(?!\w) 可能更合适。(或者 ((?:([igm])(?!\w*\3))*)(?!\w) - scagood
显示剩余4条评论

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