Perl正则表达式与不需要的模式匹配

时间:2014-05-28 05:37:26

标签: regex perl

我是Perl编程的新手,请帮帮我。

我要搜索模式并对其进行修改, 模式是

FATAL_ERROR(TRACE_ERROR, "any format string", arguments);

这是我搜索模式的方式

while(/(FATAL_ERROR\s*\(\s*([A-Za-z0-9_\s\|\(\).\[\]]+)[\\,\s]+((\".*?\"\s*\\*\s*)*)[^"]*?;)/sgm)

但问题是,脚本开始匹配正则表达式

MACSIM_FATAL_ERROR(TRACE_ERROR, "format string", arguments);

请建议我解决。

3 个答案:

答案 0 :(得分:1)

通过添加^字符

将搜索锚定到从行首开始匹配
while(/(^FATAL_ERROR\s*(\s*([A-Za-z0-9_\s\|().[]]+)[\,\s]+((\".?\"\s\*\s*))[^"]?;)/sgm)

答案 1 :(得分:1)

您只需在正则表达式前面添加单词边界\b

while (/(\bFATAL_ERROR\s*\(\s*([A-Za-z0-9_\s\|\(\).\[\]]+)[\\,\s]+((\".*?\"\s*\\*\s*)*)[^"]*?;)/sgm)

如果你想要更具限制性,比如使用^锚定到字符串的开头,你可以这样做。但以上就是你需要确保FATAL_ERROR是一个有限的词。

注意:没有分析你的正则表达式的其余部分,虽然我怀疑它可以简化/改进。

答案 2 :(得分:0)

如果它不是该行的第一个项目,但在字符串前面有空格(基于user1717159答案),则为空格添加匹配项(\ s +):

while(/(^\s+FATAL_ERROR\s*(\s*([A-Za-z0-9_\s\|().[]]+)[\,\s]+((\".?\"\s\*\s*))[^"]?;)/sgm)

匹配空格或是否可以添加条件来检查违规字符串,例如:

while((/(^\s+FATAL_ERROR\s*(\s*([A-Za-z0-9_\s\|().[]]+)[\,\s]+((\".?\"\s\*\s*))[^"]?;)/sgm) &&
     ( ! /MACSIM_FATAL_ERROR/ ))