我正在尝试编写一个 JavaScript 正则表达式,仅匹配 HTML 中的 NASM 风格注释。例如,将“;中断”
匹配为“INT 21h ;中断”
。
您可能知道 /;.*/
不能作为答案,因为注释之前可能有一个 HTML 实体;我认为 /(?:[^&]|&.+;)*(;.*)$/
应该适用于它,但我发现它有两个问题:
" ; hello world".match(/(?:[^&]|&.+;)*(;.*)$/)
是一个数组[" ; Hello World ", "; Hello World "]
。我不需要数组。" ; Hello World ;一条消息".match(/(?:[^&]|&.+;)*(;.*)$/)
是[" ; Hello World ;一条消息", ";一条消息"]
;第二个元素更糟糕。
问题:
- 为什么返回
(?:)
block ? - 为什么是
"; 一条消息"
,而不是"; hello world; 一条消息"
? - 我可以使用什么正确的正则表达式?
最佳答案
1) (?:) 没有被返回。您所看到的是 .match() 方法总是返回一个数组:第一个元素是整个匹配项,后面的元素(如果有)是反向引用。在本例中,您有一个反向引用,因此该数组包含两项。
2)因为你的正则表达式的前半部分:
(?:[^&]|&.+;)*
这不是一个好主意!这将匹配任何内容,甚至包括新行!事实上,唯一它不匹配的是后面没有“;”的“&”。在同一条线上。因此,它匹配直到最后一个“;”的所有内容。在你的每一行中。
3) 我对 HTML 中的 MASM 风格的注释一点也不熟悉,所以我需要查看更广泛的列表,其中包含您想要匹配/不匹配的内容,以便在这里自信地给出一个好的答案。
但是我很快就整理出了一些东西,至少可以解决您上面给出的两个示例:
.*&.*?;\s(;.*)$
关于带有多个括号的javascript正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17442468/