Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式-字符串内的注释检测器_Java_Regex_String_Comments - Fatal编程技术网

Java正则表达式-字符串内的注释检测器

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");

如何使用regex注释检测,但如果在字符串中,则它应该不起作用。
例如:

//----------------------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()
提取输入字符串的一部分,但它没有按预期工作,请向我们展示您是如何使用它的。