Javascript正则表达式匹配正则表达式

时间:2013-07-24 19:57:05

标签: javascript regex

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

1 个答案:

答案 0 :(得分:8)

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

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

要打破它,

  1. \/与文字/
  2. 相匹配
  3. (?![*+?])是必要的,因为/*会发表评论,而非正则表达式。
  4. [^\r\n\[/\\]匹配任何非转义序列字符和非字符组
  5. \[...\]匹配可以包含未转义的/的字符组。
  6. \\.匹配转义序列的前缀
  7. +是必要的,因为//是一个行注释,而不是正则表达式。
  8. (?:g...)?匹配非重复正则表达式标志的任意组合。太丑了。
  9. 这不会尝试配对括号,或检查重复修饰符是否未应用于自身,但会过滤掉正则表达式无法进行语法检查的大多数其他方式。

    如果你需要一个只与身体匹配的东西,那就剥掉其他一切:

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

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