我正在尝试创建Markdown-to-HTML解析器。我试图使用正则表达式来匹配可能包含或不包含HTML标记和空格/换行符的输入字符串。我遇到了一个我根本不理解的有趣案例。
我的正则表达式是regex = /\*([\w\s]+|<.+>)\*/g
。
以下作品:
'*words\nmorewords*'.match(regex)
'*<b>words</b>*'.match(regex)
然而,这不起作用:
'*<b>words\nmore words</b>*'.match(regex)
如果有人能帮助我理解为什么会这样,我会很感激。
编辑:感谢Ry,我看到了我错误的逻辑。表达式regex = /\*(<[a-z]+>)?[\w\s]+(<\/[a-z]+>)?\*/g
解决了这种情况。
答案 0 :(得分:1)
这应该适用于您的目的:
\*(<.+>)?([\w\s]+)(<.+>)?\*
HTML标记是否存在(<.+>)?
。 \n
与\s
(空白)匹配。
我还要链接规范的don't parse HTML with regex答案,因为正则表达式不适合(或甚至不能)在相当有限的子集之外解析HTML。读一读,它的内容丰富(而且有趣)!
回想Chomsky Heirarchy。正则表达式可以解析常规语言。 HTML不是常规语言(它是下一级,上下文敏感)。
一些正则表达式引擎有扩展,可以提供递归功能。您可以使用这些解析HTML,但有更好的方法,例如使用适当的HTML解析器,例如DOMParser。