如何使用正则表达式注释检测,但如果在字符串内部它应该不起作用。
例如:
//----------------------example-----------------------------------------
class fo{
void foo(){
/***print comment
*/
System.out.println("example writing comment // this is comment");
System.out.println("example comment 1 /* comment1 */");
System.out.println("example comment 2 /* comment2 "+
"*/");
}
}
这里是我的评论检测模式:
Pattern.compile("^([^\"]|\"[^\"]*\")*?((/\\*([^\\*]|(\\*(?!/))+)*+\\*+/)|(//.*))");
但它不起作用
所以,它应该是// this is comment
,/ * comment1 * /,/* comment2 "+
"*/"
必须不匹配。
答案 0 :(得分:1)
您可以通过注意注释必须以零或更多“单位”的序列开头来解决此问题,您可以将单位定义为:
"
或"
后跟零个或多个非引号字符,后跟"
。 所以应该制作模式
"^([^\"]|\"[^\"]*\")*?((/\\*([^\\*]|(\\*(?!/))+)*+\\*+/)|(//.*))"
我所做的是在您的模式之前
^([^"]|"[^"]*")*?
(当然,我必须逃避"
个字符)。这意味着字符串以0或更多“单位”开头,正如我在上面定义的那样。最后一个*?
表示我们匹配最小可能的单位数,以便我们找到其中一个单位之后的第一个注释。
第一个^
是将模式锚定到字符串开头所必需的,以确保匹配器不会尝试在字符串文字内启动匹配。我相信您可以使用\\G
代替^
,因为\\G
表示“输入的开始”。如果您尝试重复模式匹配并在字符串中查找所有注释,那将更有效。
注意:我已经对此进行了测试,似乎有效。
注2:由此产生的正则表达式非常难看。在StackOverflow上非常流行,认为正则表达式可以解决所有可能的问题,包括找到治愈癌症的方法;但是当结果像这样不可读时,是时候开始询问使用像循环这样无聊的东西是否更简单,更易读,更可靠。我不认为正则表达式更有效率,尽管我还没有检查过它。
答案 1 :(得分:-1)
您创建的正则表达式表达式中缺少一些转义字符,尽管这可能与您尝试执行的操作不符。这是您的更正版本。
Pattern.compile("((\\/\\*([^\\*]|(\\*(?!\\/))+)*\\+\\*\\+\\/)|(\\/\\/.*))");
但是,如果您要在IDE中使用替换正则表达式,请使用\".*?(\/\/.*?)\"
并将组$1
替换为空字符串。
如果您想使用Java替换字符串,请尝试以下操作:
Pattern p = Pattern.compile("(.*?)(\\/\\/.*?)");
String output = "";
String input = "example writing comment // this is comment";
Matcher m = p.matcher(input);
if (m.find())
output = m.replaceFirst("$1");
修改强>
根据您的新问题,我提供了以下答案。但是,你的问题仍然不清楚。
Pattern p = Pattern.compile("^((.*?)((\\/\\/.*?)|(\\/\\*(.*)\\*\\/)(.*))?)$");
String output = "";
String input = "example writing comment // this is comment";
Matcher m = p.matcher(input);
if (m.find())
output = m.replaceAll("$2$7");
此示例将替换字符串,如下所示:
"example writing comment // this is comment"
"example comment 1 /* comment1 */"
"example comment 2 /* comment2 "