【问题标题】:Match string unless it is inside square brackets匹配字符串,除非它在方括号内
【发布时间】:2013-01-04 17:13:50
【问题描述】:

我正在尝试调整我发现的一个 JQuery zen 编码插件以适应我自己的用途。我遇到的问题之一是代码中的一个错误,例如

a[href="google.com"]

将扩展为

 <a href="google.com" class="com"</a>

代码使用的正则表达式是:

/(\.[\w-]+)/gi

我已经修改了前瞻,看看它前面是否有偶数个括号。

/(\.[\w-]+)(?=([^\]]*\][^\]]*\])*[^\]]*$)/gi

我使用过正则表达式测试器,它似乎可以工作,但是当使用 javascript .match() 时,它会返回“.com”作为上述字符串中的匹配项。

下面的回复解决了有问题的错误,但创建了一个新错误。现在:

a.class[href="google.com"]

没有解决

http://jsfiddle.net/sA9sQ/

编辑: 我接受了下面的答案,因为它把我带到了我需要去的地方。最后的正则表达式竟然是/(\.[\w-]+)(?=([^\]]*\][^\]]*\])*[^\]]*\.[\w-]+)/gi

【问题讨论】:

  • /gi 是什么? /g 用于所有!但是 /gi 用于什么?
  • @AspiringAqib i = 不区分大小写。这里没有效果,但以防万一仍然是一个很好的做法。
  • @JanDvorak 你能举个例子吗?
  • 请注意,您只计算右括号。也许你应该看看下一个左括号或下一个右括号是否更接近。
  • @AspiringAqib /a/i.test("A") //true

标签: javascript regex lookahead


【解决方案1】:

尝试将前瞻移到正则表达式的前面,如下所示:

/(?=([^\]]*\][^\]]*\])*[^\]]*$)(\.[\w-]+)/gi

【讨论】:

  • 做到了。谢谢!你能解释一下为什么吗?说到正则表达式,我很绿色。
  • @ChrisSobolewski 这将修改断言发生的位置。不过,不知道为什么它会改变这里的结果。
  • 我不是 100% 确定,但我相信这与它评估表达式的顺序有关。在您的情况下,它首先评估 (\.[\w-]+),找到匹配项,然后评估 (?=([^\]]*\][^\]]*\])*[^\]]*$),然后不进行其他搜索。由于这也是一个有效的匹配,它实际上只是搜索(\.[\w-]+)。通过将前瞻移到前面,它现在首先计算前瞻,然后检查是否在前瞻之后找到下一个表达式。
  • 对不起,我刚看到评论。我很高兴你得到了答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2019-01-12
相关资源
最近更新 更多