flex 中c的注释/*aaa*/的正则表达式如何写?

alphapaopao 2003-10-13 12:48:09
"/*"(([^*]|("*"[^/*]))*)("*"/"*")*("*/") printf("c comments:\n\n%s[END]\n\n\n", yytext);

这是我写的,后来发现不对。
注释的DFA很容易做出来,但是为什么他的正则表达式那么难写?
...全文
315 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
borlang 2003-10-20
  • 打赏
  • 举报
回复
这样也可以:(/\*).*?(\*/)
alphapaopao 2003-10-16
  • 打赏
  • 举报
回复
ttmmdd(老孩子) 的的确可以,我已经成功匹配
/**/
/***/
/*aa*/
/*aa**/
alphapaopao 2003-10-14
  • 打赏
  • 举报
回复
/*aa**/ 无法正确匹配
ttmmdd 2003-10-14
  • 打赏
  • 举报
回复
恩?我用到现在没问题啊?
warton 2003-10-14
  • 打赏
  • 举报
回复
贴子不错!!我还是用php时简单地学习了一下正则表达式,现在忘记得差不多了!
alphapaopao 2003-10-14
  • 打赏
  • 举报
回复
ttmmdd(老孩子) 的不行,我的也不行
ttmmdd 2003-10-14
  • 打赏
  • 举报
回复
我试过了,可以匹配的.
/*aa**/
《/*》 匹配 "/*"
《aa》 匹配 (([^*/])+([/])*)*
《*》 匹配 (
  • *
  • (([^*/])+([/])*)*)因为 (([^*/])+([/])*)*可以为空.
    《*/》 匹配 "*/"
warton 2003-10-14
  • 打赏
  • 举报
回复
试试这个:((\/\*((\*[^\/]+)|[^\*])+\*\/)|(\/\/))
alphapaopao 2003-10-14
  • 打赏
  • 举报
回复
哇!!置顶了!
alphapaopao 2003-10-13
  • 打赏
  • 举报
回复
"/*"([^*]|\*[^/*])*"*/"

这个好像也可以
alphapaopao 2003-10-13
  • 打赏
  • 举报
回复
楼上的牛!!!
不过我还没理解这个表达式
ttmmdd 2003-10-13
  • 打赏
  • 举报
回复
这个是可以地...
"/*"(
  • *
  • (([^*/])+([/])*)*)*"*/"
alphapaopao 2003-10-13
  • 打赏
  • 举报
回复
== 对于 /*foo*abc*/ 的匹配过程 == 注:《》里面是要匹配的字符串
《/*》 匹配 "/*"
《foo》 匹配 [^*]
《*》 foo后面的*匹配 \*(\**)
《abc》将从头匹配,因为它是重复多个的 ([^*]*\*(\**))+ ,它匹配到了这个表达式开头的 [^*]
《*》 abc后面的*匹配 \*(\**)
《/》 匹配 "/"


请大虾指教!
alphapaopao 2003-10-13
  • 打赏
  • 举报
回复
== 对于 /*foo*abc*/ 的匹配过程 == 注:《》里面是要匹配的字符串
《/*》 匹配 "/*"
《foo》 foo后面的*匹配 [^*]
《*》 匹配 \*(\**)
《abc》将从头匹配,因为它是重复多个的 ([^*]*\*(\**))+ ,它匹配到了这个表达式开头的 [^*]
《*》 abc后面的*匹配 \*(\**)
《/》 匹配 "/"


请大虾指教!
alphapaopao 2003-10-13
  • 打赏
  • 举报
回复
"/*"([^*]*\*(\**))+"/"
我觉得我这个应该没问题阿,是在看不出来什么地方有问题。还请指教:

"/*" 匹配开始标记
[^*]* 匹配不是*的字符
\* 匹配一个星号*
\** 匹配*,0个,若干个
([^*]*\*(\**))+ 这样的情况1个,或多个

"/" 最后匹配结束符号 /

== 对于 /* define a integer variable */ 的匹配过程 == 注:《》里面是要匹配的字符串
《/*》 匹配 "/*"
《 define a integer variable 》 匹配 [^*]
《*》 匹配 \*(\**)
《/》 匹配 "/"
Riemann 2003-10-13
  • 打赏
  • 举报
回复
写注释的正则表达式要考虑得东西很多。在你的表达式中很多情况都是不能匹配到的。
例如:int i; /* define a integer variable */
/* comment */ /* This is
a comment */
下面是我曾经看到过的一种写法,感觉挺不错的。
%{
int comments, code, spaceline;
%}

%x COMMENT
%%
^[ \t]*"/*" { BEGIN COMMENT; /* 进入注视处理状态 */ }
^[ \t]*"/*".*"*/"[ \t]*\n { comments++; /* 处理注释的自包含 */ }
<COMMENT>"*/"[ \t]*\n { BEGIN 0; comments++; }
<COMMENT>"*/" { BEGIN 0; }
<COMMENT>\n { comments++; } /* 处理注释中的空行 */
<COMMENT>.\n { comments++; } /* 处理注释中的文本 */

^[ \t]*\n { spaceline++; } /* 处理空行 */

.+"/*".*"*/".*\n { code++; }
.*"/*".*"*/".+\n { code++; }
.+"/*".*\n { code++; BEGIN COMMENT; }
.\n { code++; }
.; /* 忽略其他 */
%%

main()
{
yylex();
printf("code: %d, commnents: %d, spaceline: %d\n",
code, comments, spaceline);
}
alphapaopao 2003-10-13
  • 打赏
  • 举报
回复
"/*"([^*]*\*(\**))+"/"

冥思苦想,这个看样子是可以的。但是还是匹配不到。郁闷
alphapaopao 2003-10-13
  • 打赏
  • 举报
回复
up

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧