Perl Regex中的贪婪与非贪婪

时间:2014-01-19 06:56:02

标签: regex perl

以下是我正在尝试执行正则表达式的文本行:

"MATS"?"Base Revenue Element"?#Mi?#Mi

这是我的正则表达式:

s/\?[^"]/FOUND/;

我希望得到:

"MATS"?"Base Revenue Element"?FOUNDMi?FOUNDMi

但我得到了:

"MATS"?"Base Revenue Element"?FOUNDMi?#Mi

所以我把它换成了:

s/\?[^"]?/FOUND/;

但现在我明白了:

"MATS"FOUND"Base Revenue Element"?#Mi?#Mi

所以:

  1. 为什么它只执行一次查找,然后在文本行中停止?
  2. 为什么要添加非贪心?让它找到第一个问号,即使它在双引号旁边?

1 个答案:

答案 0 :(得分:3)

  1. 因为s///默认只进行一次替换。您可以使用g修饰符尽可能多地执行此操作:s/\?[^"]/FOUND/g;

  2. 因为?不是"非贪婪的修饰符"跟随一个原子,它是"零或一个"量词。 \?[^"]?匹配问号(可选),后跟非引号字符;它会匹配"?"如果它后面跟一个报价单独。贪婪实际上与这里发生的事情毫无关系。