一尘不染

Java正则表达式以匹配C样式的多行注释

java

我有一个字符串例如

String src = "How are things today /* this is comment *\*/ and is your code  /*\* this is another comment */ working?"

我想从字符串中删除/* this is comment *\*//** this is another comment */src字符串。

我尝试使用正则表达式,但由于经验不足而失败。


阅读 505

收藏
2020-03-05

共2个答案

一尘不染

尝试使用此正则表达式(仅单行注释):

String src ="How are things today /* this is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("/\\*.*?\\*/","");//single line comments
System.out.println(result);

REGEX解释:

从字面上匹配字符“ /”

从字面上匹配字符“ *”

“。” 匹配任何单个字符

“ *?” 在0到无限制的时间之间,尽可能少的时间,根据需要扩展(延迟)

从字面上匹配字符“ *”

从字面上匹配字符“ /”

另外,这里是通过添加(?s)来表示单行和多行注释的正则表达式:

//note the added \n which wont work with previous regex
String src ="How are things today /* this\n is comment */ and is your code /* this is another comment */ working?";
String result=src.replaceAll("(?s)/\\*.*?\\*/","");
System.out.println(result);
2020-03-05
一尘不染

在最好的多行注释的正则表达式是一个展开的版本(?s)/\*.*?\*/,看起来像

String pat = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/";

请参阅regex101.com上的regex演示和说明。

简而言之,

  • /\*-匹配评论开始 /*
  • [^*]*\*+-匹配0+个字符,*后跟1+文字*
  • (?:[^/*][^*]*\*+)* -0+序列:
  • [^/*][^*]*\*+-不是a /或*(与匹配[^/*]),后跟0+个非星号字符([^*]*),后接1+个星号(\*+
  • / -结束 /

David的正则表达式需要26个步骤才能在我的示例字符串中找到匹配项,而[my regex] [2]仅需要12个步骤。在输入大量信息的情况下,David的正则表达式很可能会因堆栈溢出问题或类似原因而失败,因为.*?由于正则表达式引擎执行的每个位置处的惰性模式扩展,导致惰性点匹配效率低下,而我的模式却一口气匹配了线性文本块。

2020-03-05