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

Javascript 关于RegExp匹配、HTML标记和换行符的混淆,javascript,regex,Javascript,Regex,我正在尝试创建一个标记到HTML解析器。我试图使用正则表达式来匹配可能包含或不包含HTML标记和空格/换行符的输入字符串。我遇到了一个我完全不理解的有趣案例 我的正则表达式是regex=/\*([\w\s]+\*/g 以下工作: '*words\nmorewords*'.match(regex) '*<b>words</b>*'.match(regex) “*单词\n重写单词*”.匹配(正则表达式) “*单词*”.匹配(正则表达式) 但是,这不起作用: '*<b

我正在尝试创建一个标记到HTML解析器。我试图使用正则表达式来匹配可能包含或不包含HTML标记和空格/换行符的输入字符串。我遇到了一个我完全不理解的有趣案例

我的正则表达式是
regex=/\*([\w\s]+\*/g

以下工作:

'*words\nmorewords*'.match(regex)
'*<b>words</b>*'.match(regex)
“*单词\n重写单词*”.匹配(正则表达式)
“*单词*”.匹配(正则表达式)
但是,这不起作用:

'*<b>words\nmore words</b>*'.match(regex)
“*单词\n更多单词*”.匹配(正则表达式)
如果有人能帮我理解为什么会这样,我将不胜感激


编辑:多亏了Ry,我看到了我的错误逻辑。表达式
regex=/\*()?[\w\s]+()?\*/g
解决了这个问题。

这应该适用于您的目的:

\*(<.+>)?([\w\s]+)(<.+>)?\*
\*()?([\w\s]+)()\*
HTML标记可以存在也可以不存在
()?
\n
\s
(空白)匹配

我还将链接规范的答案,因为正则表达式不适合(甚至不能)在相当有限的子集之外解析HTML。读一读,它的信息(和有趣)

回想一下。正则表达式可以解析正则语言。HTML不是一种常规语言(它是上一级语言,与上下文相关)


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

不匹配没有
/s
标志的换行符。您可以改用
[^]
。不过,任何涉及regex和HTML的东西都可能会很脆弱,我不确定自己是否理解。我在标记本身中没有任何空格(即在每组
之间),那么为什么这会相关呢?HTML标记之间的子字符串不应该由我的正则表达式的第一部分来处理吗?
在自己匹配
单词之前。你是否打算让这群人重复,只是让
匹配标签?@Ry我真不敢相信我错过了。。。是的,我只是想匹配标签。我现在明白问题所在了,谢谢。不过,我还是没有找到解决办法。谢谢!我使用了一个稍微不同的解决方案,但它遵循与您的答案相同的逻辑,并且没有有用的链接。在我的例子中,这更像是regex中的个人练习,而不是实际的HTML项目(事实上HTML是由解析它的同一个函数生成的),但我肯定会记住未来项目的建议。是的,对于简单的东西,regex可以正常工作。:)