正则表达式转义带有注释的行

Posted

技术标签:

【中文标题】正则表达式转义带有注释的行【英文标题】:Regular Expression to Escape Lines with Comments 【发布时间】:2012-01-27 20:49:50 【问题描述】:

我使用了正则表达式//.*|(\"(?:\\\\[^\"]|\\\\\"|.)*?\")|(?s)/\\*.*?\\*/ 来转义注释行,它运行良好,但它卡在if (broper.equals("//BR") && brlnum.equals("0")) 行上,并将其视为注释行并转义。

需要什么修正?

【问题讨论】:

我认为您需要在递归函数中使用正则表达式,该函数用于确定您是否在引号内 @moon 我从这里得到了这个***.com/questions/1657066/…。是否可以通过更改上面的正则表达式使其能够避免字符串匹配? 我认为您想匹配所有 cmets,即 //... 直到行尾并阻止 cmets /* ... */ 【参考方案1】:

如果 cmets 本身可以包含奇数个引号,这有点冒险并且会失败。但是,如果这不是问题,您可以查找 //s 后跟偶数个引号,从而确保此时您不在字符串中:

//(?:[^"\r\n]*"[^"\r\n]*")*[^"\r\n]*$|/\*.*?\*/

第二个选项匹配标准,未嵌套的/*...*/ cmets。

在 Java 中:

Pattern regex = Pattern.compile("//(?:[^\"\r\n]*\"[^\"\r\n]*\")*[^\"\r\n]*$|/\\*.*?\\*/", Pattern.DOTALL | Pattern.MULTILINE);

【讨论】:

@Pietzcker o 感谢您的回复,但这不是一般情况,实际上我的基本要求是我必须删除这种类型的评论 String str = srclines[lineNum];// skip the comments 意味着可以在分隔符(;)之后。 你试过这个正则表达式吗?它不工作吗?如果是这样,它在什么文本上失败了? @Pietzcker 实际上我希望如果评论字符出现在双引号内,那么应该忽略它,否则应该处理它以删除评论。例如if ("\\BR".equals(str) && !otherString.contains("\\BR") // Condition to skip 然后只删除 // 要跳过的条件 嗯,是的,这正是这个正则表达式所做的。这就是为什么我问你是否尝试过。 @Pietzcker String s= "if (broper.equals(\"//BR\") && brlnum.equals(\"0\"\"))"; String regex = "//(?:[^\"\r\n]*\"[^\"\r\n]*\")*[^\"\r\n]*$|/\\*.*?\\*/"; String str = s.replaceAll(regex, ""); 这段代码产生了一个字符串if (broper.equals(" 实际上不应该被正则表达式替换,我想要。是的,我在这里引用了奇数个引号,但这可能是在测试用例中。

以上是关于正则表达式转义带有注释的行的主要内容,如果未能解决你的问题,请参考以下文章

带有转义引号的引用字符串的正则表达式

Linux正则表达式

Linux 正则表达

Linux 正则表达

Ansible:带有正则表达式的lineinfile模块并循环添加没有正则表达式的行

notepad++正则表达式