我使用以下内容使其部分工作:
%{
#define OR 2
#define AND 3
.........
.........
%}
delim [ \t]
ws {delim}*
letter [A-Za-z]
digit [0-9]
comments [/]+({letter}|{digit}|{delim})*
%%
{comments} {return(COMMENT);}
......................
......................
%%
int main()
{
int tkn = 0;
while (tkn = yylex())
{
switch (tkn)
{
case COMMENT:
printf("GOT COMMENT");
}
}
}
这很好用。问题是正则表达式显然无法识别特殊字符,因为[/]+({letter}|{digit}|{delim})*
不考虑特殊字符。如何更改正则表达式以容纳更多字符直到行尾?
答案 0 :(得分:2)
你能不能只使用
[/]+.*
它会匹配一些 / 然后直到行尾的任何内容。当然,这不会涵盖 / * COMMENT * / 等评论。
答案 1 :(得分:1)
可能是迟到了。但我发现这更适合使用\/[\/]+.*
这将涵盖双斜线和更多,然后是文本的其余部分。
以下是regex101.com
的解释\/
字面匹配字符/
(区分大小写)匹配文本中的单个字符
[\/]+
+
量词 - 在一次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)\/
从字面上匹配字符/
(区分大小写)
.*
匹配任何字符(行终止符除外)
答案 2 :(得分:1)
以'//'开头的单行注释表达式可以被下面的正则表达式捕获。
\/\/[^\r\n]*
\/\/
匹配双斜线
[^\r\n]*
匹配尽可能多的非回车或换行字符。
但是,当行中的最后一个字符是反斜杠 (\) 时,C 语言允许将单行注释扩展到下一行。因此,您可能需要使用以下内容。
\/\/[^\r\n]*(?:(?<=\\)\r?\n[^\r\n]*)*
\/\/
匹配双斜线
[^\r\n]*
匹配尽可能多的不是回车 (\r) 或换行 (\n) 的字符
(?:
开始一个非捕获组
(?<=\\)
断言反斜杠 (\) 紧跟在当前位置之前
\r?\n
匹配行尾
[^\r\n]*
匹配尽可能多的不是回车 (\r) 或换行符的字符
)*
完成非捕获组并让它重复 0 次或更多次
注意这个方法有问题。根据您在做什么,您可能需要查找并使用词法扫描器。词法扫描器可以避免以下问题。
扫描文本
/* Comment appears to have // a comment inside it */
将匹配
// a comment inside it */
扫描文本
char* a = "string appears to have // a comment";
将匹配
// a comment";
答案 3 :(得分:0)
为什么你不能写
"//"|"/*" {return(COMMENT);}