正则表达式匹配C风格的多行评论

han*_*ant 18 java regex string

我有一个字符串,例如

String src = "How are things today /* this is comment *\*/ and is your code  /*\* this is another comment */ working?"
Run Code Online (Sandbox Code Playgroud)

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

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

Wik*_*żew 30

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

String pat = "/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/";
Run Code Online (Sandbox Code Playgroud)

请参阅regex101.com上的正则表达式解释.

简而言之,

  • /\*- 匹配评论开始,/*以及之后的任何0+星号
  • [^*]*\*+- 匹配0+字符,而不是*1+字面*
  • (?:[^/*][^*]*\*+)* - 0+序列:
    • [^/*][^*]*\*+- 不是a /*(匹配[^/*])后跟0+非星号字符([^*]*)后跟1+星号(\*+)
  • / - 结束 /

David的正则表达式需要26步才能在我的示例字符串中找到匹配项,而我的正则表达式只需要12步.有了巨大的输入,David的正则表达式可能会因堆栈溢出问题或类似问题而失败,因为.*?由于正则表达式引擎执行的每个位置的延迟模式扩展,懒惰点匹配效率低,而我的模式一次性匹配线性文本块.

  • @ AT-Aoi它基本上取自*掌握正则表达式*,*删除C评论*部分. (2认同)
  • 如果不参考特定的正则表达式引擎和版本,通常无法做出“因为 .*? 惰性点匹配效率低下”之类的假设。即使它适用于某些引擎,但它可能不适用于另一种引擎,甚至不适用于同一引擎的不同版本。它没有定义正则表达式引擎如何工作;这类似于 SQL 没有指定数据库在幕后的实际工作方式。 (2认同)

Dav*_*amp 15

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

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);
Run Code Online (Sandbox Code Playgroud)

REGEX解释说:

从字面上匹配字符"/"

字面上匹配字符"*"

"" 匹配任何单个字符

"*?" 在零和无限次之间,尽可能少的时间,根据需要扩展(懒惰)

字面上匹配字符"*"

从字面上匹配字符"/"

或者,通过添加(?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);
Run Code Online (Sandbox Code Playgroud)

参考:

  • 如果您有一个包含注释序列的字符串,那将很有趣. (5认同)
  • @brimborium:`(?s)`是DOTALL,这意味着`.`甚至会匹配换行符(默认情况下它不匹配). (3认同)