Java正则表达式-字符串内的注释检测器
如何使用regex注释检测,但如果在字符串中,则它应该不起作用。Java正则表达式-字符串内的注释检测器,java,regex,string,comments,Java,Regex,String,Comments,如何使用regex注释检测,但如果在字符串中,则它应该不起作用。 例如: //----------------------example----------------------------------------- class fo{ void foo(){ /***print comment */ System.out.println("example writing comment // this is comment");
例如:
//----------------------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("^([^\"]|\"[^\"]*\")*?((/\\*([^\\*]|(\\*(?!/))+)*+\\*+/)|(//.*))");
但它不起作用
因此,它应该是注释,/*comment1*/,/*comment2“+
“*/”
不能匹配。您创建的正则表达式缺少一些转义字符,尽管这可能不适合您尝试执行的操作。这是您的更正版本。
Pattern.compile((\\/\*([^\\*]\;(\\*(?!\\/))+)*\\+\*\\+\/)\\\+\/)\(\\\/\/.*));
但是,如果希望在IDE中使用replace regex表达式,请使用\“*?(\/\/.*?”
并将组$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");
此示例将替换字符串,如下所示:
“编写注释的示例//这是注释”
- 写作评论示例
“示例注释1/*comment1*/”
- 示例注释1
“示例注释2/*comment2”
- 示例注释2/*comment2
- 除
以外的单个字符,或“
- 字符串文字,即
,后跟零个或多个非引号字符,后跟“
李>”
"^([^\"]|\"[^\"]*\")*?((/\\*([^\\*]|(\\*(?!/))+)*+\\*+/)|(//.*))"
我所做的是在你的模式之前
^([^"]|"[^"]*")*?
(当然,我必须对“
字符进行转义)。这意味着字符串以我上面定义的0个或多个“单位”开头。最后一个*?
意味着我们匹配尽可能少的单位数,以便找到其中一个单位后面的第一条注释
第一个^
是将模式锚定到字符串开头所必需的,以确保匹配器不会尝试在字符串文本中开始匹配。我相信您可以使用\\G
而不是^
,因为\\G
表示“输入的开始”“。如果您尝试重复模式匹配并在字符串中查找所有注释,则效果会更好
注意:我已经对此进行了测试,它似乎有效
注2:生成的正则表达式非常难看。在StackOverflow上,人们普遍认为正则表达式可以解决所有可能的问题,包括找到治疗癌症的方法;但是,当结果像这样不可读时,是时候开始询问是否使用像循环这样无聊的东西会更简单、更可读、更可靠。我也不认为正则表达式更有效,尽管我还没有检查过它。你的正则表达式没有回答这个问题。OP希望能够进行一个匹配,忽略带引号字符串中的注释。我在你的正则表达式中没有看到任何引号,因此你的正则表达式对带引号的字符串没有做任何特殊的处理。此外,你的更正是错误的。正斜杠在正则表达式中没有特殊意义,因此转义它们是没有意义的。您转义的加号正被用作前面量词的所有格修饰词,因此转义它们破坏了正则表达式。首先,问题没有定义OP希望如何使用正则表达式的确切上下文。其次,我转义的“+”对于我将它们更改为的上下文是正确的;OP误用了它们。第三,前斜杠在某些语言中确实有意义。例如,JavaScript专门使用正斜杠来定义正则表达式。逃离他们是一种很好的做法。然而,我没有在我的IDE中测试任何东西,因为我远离使用IntelliJ或Eclipse的计算机。另外,我很少为Java编写正则表达式。我从来没有听说过在Java正则表达式中避免正斜杠是一种“好的做法”。我已经更新了我的帖子,我希望这个例子足够好。对不起,我已经更新了我的帖子,但它仍然不起作用。它按照我预期的方式工作。如果它对您不起作用,请编辑您的问题,并包括您正在使用的新代码、源字符串、您预期的输出以及实际的输出。(或开始一个新问题)包括所有相关的代码。特别是,如果您正在使用
group()
提取输入字符串的一部分,但它没有按预期工作,请向我们展示您是如何使用它的。