标签: reluctant-quantifiers

正则表达式:懒惰更糟吗?

我总是写这样的正则表达式

<A HREF="([^"]*)" TARGET="_blank">([^<]*)</A>
Run Code Online (Sandbox Code Playgroud)

但我刚刚了解了这个懒惰的东西,我可以这样写

<A HREF="(.*?)" TARGET="_blank">(.*?)</A>
Run Code Online (Sandbox Code Playgroud)

使用第二种方法有什么不利之处吗?正则表达式肯定更紧凑(即使SO更好地解析它).

编辑:这里有两个最佳答案,指出表达式之间的两个重要差异.ysth的答案指向非贪婪/懒惰的弱点,其中超链接本身可能包含A标签的其他属性(绝对不好).Rob Kennedy在贪婪的例子中指出了一个弱点,因为锚文本不能包含其他标签(绝对不行,因为它也不会抓住所有的锚文本)......所以答案是,正则表达式就是他们的是,懒惰和非懒惰的解决方案似乎相同可能在语义上不等同.

编辑:第三个最佳答案是Alan M关于表达式的相对速度.暂时,我会将他标记为最佳答案,以便人们给他更多积分:)

regex non-greedy reluctant-quantifiers regex-greedy

12
推荐指数
3
解决办法
1315
查看次数

精确贪婪/不情愿X {n}之间的区别?

在Java Pattern类的文档中,我看到确切的量词X{n}有贪婪和不情愿的形式:

贪婪的量词

  • X {n} X,正好是n次
  • ...

不情愿的量词

  • X {N}?X,正好是n次
  • ...

文档给出了贪婪和不情愿行为之间差异的一般示例,但没有给出确切量词的任何示例.

起初我想,"好吧,也许差异在于它X本身可以以不同的方式匹配." 但是其中X可以有自己的贪婪/不情愿的说明者,而且我确实测试了它,这不是一个区别(贪婪不情愿).

鉴于此,在任何一种情况下,它都会完全匹配n,两者的行为之间是否有任何区别?

regex reluctant-quantifiers regex-greedy

6
推荐指数
1
解决办法
94
查看次数

编写更好的正则表达式表达式,不使用惰性重复量词

我有一个正则表达式:

(<select([^>]*>))(.*?)(</select\s*>)
Run Code Online (Sandbox Code Playgroud)

由于它使用延迟重复量词,对于更长的字符串(选项超过500),它回溯超过100,000次并失败.请帮我找一个更好的正则表达式,不使用懒惰重复量词

regex reluctant-quantifiers

5
推荐指数
1
解决办法
474
查看次数

这个正则表达式有什么问题 - 与不情愿的量词有关?

任何人都知道为什么这在javascript中不起作用?(尝试使用Chrome和Firefox):

console.log('"my name is"'.match(/"?(.*?)"?/));
Run Code Online (Sandbox Code Playgroud)

输出:

[""", "", index: 0, input: ""my name is""] 
Run Code Online (Sandbox Code Playgroud)

我期待这个:

[""my name is"", "my name is", index: 0, input: ""my name is""]
Run Code Online (Sandbox Code Playgroud)

我对解决问题的替代方法不感兴趣,而且对于我想要实现的目标而言,它不是一个完整的解决方案(我现在做的方式略有不同) - 我只是对匹配失败的原因感兴趣.

我预计不情愿的量词可以匹配所有内容,但不包括最终引用.我不明白为什么表达式无法匹配任何东西?

javascript regex reluctant-quantifiers

3
推荐指数
1
解决办法
827
查看次数