我正在开发一个特殊的正则表达式来匹配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]
答案 0 :(得分:8)
匹配正则表达式的正则表达式是
/\/((?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+)\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/
要打破它,
\/
与文字/
(?![*+?])
是必要的,因为/*
会发表评论,而非正则表达式。[^\r\n\[/\\]
匹配任何非转义序列字符和非字符组\[...\]
匹配可以包含未转义的/
的字符组。\\.
匹配转义序列的前缀+
是必要的,因为//
是一个行注释,而不是正则表达式。(?:g...)?
匹配非重复正则表达式标志的任意组合。太丑了。这不会尝试配对括号,或检查重复修饰符是否未应用于自身,但会过滤掉正则表达式无法进行语法检查的大多数其他方式。
如果你需要一个只与身体匹配的东西,那就剥掉其他一切:
/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+/
或者,在输入的开头和结尾添加"/"
。