为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

C++
阿波罗的战车 2019-09-13 11:10:49

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

我有一个字符串,例如

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串。

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


查看完整描述

3 回答

?
jeck猫

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


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解释说:


从字面上匹配字符“/”


字面上匹配字符“*”


“” 匹配任何单个字符


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


字面上匹配字符“*”


从字面上匹配字符“/”


或者,通过添加(?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);

参考:


https://www.regular-expressions.info/examplesprogrammer.html



查看完整回答
反对 回复 2019-09-16
?
墨色风雨

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

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

请参阅regex101.com上的正则表达式演示和说明。

简而言之,

  • /\* - 匹配评论开始 /*

  • [^*]*\*+- 匹配0+字符,而不是*1+字面*

  • (?:[^/*][^*]*\*+)* - 0+序列:

    • [^/*][^*]*\*+- 不是a /*(匹配[^/*])后跟0+非星号字符([^*]*)后跟1+星号(\*+

  • / - 结束 /

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



查看完整回答
反对 回复 2019-09-16
?
繁华开满天机

试试这个:

(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

如果您想要排除“”中包含的部分,请使用:

(\"[^\"]*\"(?!\\))|(//[^\n]*$|/(?!\\)\*[\s\S]*?\*(?!\\)/)

第一个捕获组识别所有“”部分,第二个捕获组为您提供注释(单行和多行)

如果要解释,请将正则表达式复制到regex101



查看完整回答
反对 回复 2019-09-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信