带有多个括号的javascript正则表达式

时间:2013-07-03 07:48:28

标签: javascript regex

我正在尝试编写一个仅与HTML中的NASM样式注释匹配的javascript正则表达式。例如,为"; interrupt"匹配"INT 21h ; interrupt"

您可能知道/;.*/不能成为答案,因为在评论之前可能有HTML实体;我认为/(?:[^&]|&.+;)*(;.*)$/应该适用它,但我发现它有两个问题:

  1. "      ; hello world".match(/(?:[^&]|&.+;)*(;.*)$/)是一个数组["      ; hello world", "; hello world"]。我不想要阵列。
  2. "      ; hello world; a message".match(/(?:[^&]|&.+;)*(;.*)$/)["      ; hello world; a message", "; a message"];更糟糕的是第二个元素。
  3. 问题:

    1. 为什么要返回(?:)块?
    2. 为什么"; a message",而不是"; hello world; a message"
    3. 我可以使用哪种正确的正则表达式?

2 个答案:

答案 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测试(我不隶属于此网站)。