我正在尝试编写一个仅与HTML中的NASM样式注释匹配的javascript正则表达式。例如,为"; interrupt"
匹配"INT 21h ; interrupt"
。
您可能知道/;.*/
不能成为答案,因为在评论之前可能有HTML实体;我认为/(?:[^&]|&.+;)*(;.*)$/
应该适用它,但我发现它有两个问题:
" ; hello world".match(/(?:[^&]|&.+;)*(;.*)$/)
是一个数组[" ; hello world", "; hello world"]
。我不想要阵列。" ; hello world; a message".match(/(?:[^&]|&.+;)*(;.*)$/)
是[" ; hello world; a message", "; a message"]
;更糟糕的是第二个元素。问题:
(?:)
块?"; a message"
,而不是"; hello world; a message"
?答案 0 :(得分:1)
1)没有返回(?:)。你看到的是.match()方法总是返回一个数组:第一个元素是整个匹配,以下元素(如果有的话)是后引用。在这种情况下,您有一个反向引用,因此该数组包含两个项目。
2)因为正则表达式的前半部分:
(?:[^&]|&.+;)*
这不是个好主意!这将匹配任何,甚至包括新行!事实上,唯一它不匹配的东西是“&”那后面没有“;”在同一条线上。因此,它匹配到最后一个“;”在你的每一行中。
3)我对HTML中的MASM风格的评论一点都不熟悉,所以我需要查看更广泛的列表,列出你想要匹配/不匹配的内容,以便在这里自信地给出一个好的答案。 / p>
但是这里有一些我很快就拼凑起来的东西,至少要解决你上面给出的两个例子:
.*&.*?;\s(;.*)$
答案 1 :(得分:0)
ad 1.)
不返回?:
块。相反,在第一个数组元素中返回完整匹配。此行为遵循非全局匹配的规范(即没有g
选项)。
ad 2.)
正则表达式的第一部分((?:[^&]|&.+;)*
)匹配太多。事实上,如果丢掉第二部分,它将匹配整行。用简单的英语,你要求匹配一个&
序列,后跟尽可能多的字符,然后分别是;
或&
以外的任何符号,你要求引擎尽可能多地重复此匹配,直到测试字符串中的最后一个;
(如果有)。
ad 3.) 尝试
(?:[^&;]*(&[a-zA-Z0-9_-]+;[^&;]*)*)(;.*)$
它修复了已损坏的实体匹配并返回最长的;
- 初始后缀。
使用pagecolumn regex tester测试(我不隶属于此网站)。