正则表达式转义带有注释的行
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("
实际上不应该被正则表达式替换,我想要。是的,我在这里引用了奇数个引号,但这可能是在测试用例中。以上是关于正则表达式转义带有注释的行的主要内容,如果未能解决你的问题,请参考以下文章