我正在尝试制作一个删除样式注释的正则表达式,//
目前/**/
,我使用了从该站点获取的一个:
(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*)
问题是当注释采用文字字符串的形式(带有单引号或双引号)时,例如:
var a = "//Holaaa";
所以我尝试使用lookbehind
andlookahead
一起来转义这两个引号,结果是这样的:
(?<!\"|\')((/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|(//.*))(?!\"|\')
问题在于它不适用于以下情况:
var ar = "asasasas /*dsdsdsd*/ "
var ar = "asaasas //dsdsdsd"
var ar = "asasasas /*dsdsdsd*/ dsadasdsda"
var ar = "asaasas //dsdsdsd asdsadsadsad"
(?<!\"|\')
我尝试逐一更改(?<!\"|\'.*)
,但这也不起作用(?!\"|\')
。(?!.*\"|\')
我错过了什么?
注意:想法是在Java中使用它,但答案不一定要在它的标准中,只要我以后知道表达式我可以自己适应它。
问题
老实说,您从该页面中提取的正则表达式很糟糕,不仅在它遗漏的内容方面,而且在效率方面。您尝试使用断言(lookahead / lookbehind)修复它是好的,但这是一种效果不佳的策略。为什么它不起作用的解释太长了,但可以总结为
(?<!"|')
只检查从当前位置返回的 1 个字符,并且尽可能多地使用可变长度(-不,它可以) t),您将无法确定之前的报价是打开还是关闭评论。简而言之:错误的策略(我们都堕落了)。解决方案
对于这种类型的情况,在寻找匹配的位置之前的所有语法都是相关的,达到这一点的方法是使用文本的每个部分,同时验证每个结构。
正则表达式应该锚定在文本的开头,或者在前一个替换(
\G
)的末尾,并匹配注释没有意义的文本,直到找到注释。从广义上讲,它将取代替换为时捕获并包含所有先前文本的位置
正则短语
现在,查找不是注释的所有内容涉及匹配除具有特殊含义的字符之外的所有字符,并添加规则以匹配每个例外(
\
转义字符、引用文本等)。为了简化解释,我用每个结构的目标注释掉了正则表达式:
或者在没有注释的一行中:
使用 Java 的转义斜杠和引号:
节目
https://regex101.com/r/wDg8LJ/1/
Java 代码
结果
节目
http://ideone.com/NSGmCL