关于RegExp匹配,HTML标记和换行符的混淆

时间:2018-05-01 00:33:41

标签: javascript regex

我正在尝试创建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解决了这种情况。

1 个答案:

答案 0 :(得分:1)

这应该适用于您的目的:

\*(<.+>)?([\w\s]+)(<.+>)?\*

HTML标记是否存在(<.+>)?\n\s(空白)匹配。

我还要链接规范的don't parse HTML with regex答案,因为正则表达式不适合(或甚至不能)在相当有限的子集之外解析HTML。读一读,它的内容丰富(而且有趣)!

回想Chomsky Heirarchy。正则表达式可以解析常规语言。 HTML不是常规语言(它是下一级,上下文敏感)。

一些正则表达式引擎有扩展,可以提供递归功能。您可以使用这些解析HTML,但有更好的方法,例如使用适当的HTML解析器,例如DOMParser