如何在C中REGEX //?单行评论

时间:2011-04-07 07:10:16

标签: c regex compiler-construction lexical-analysis

我使用以下内容使其部分工作:

        %{
        #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})*不考虑特殊字符。如何更改正则表达式以容纳更多字符直到行尾?

4 个答案:

答案 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 次或更多次

注意这个方法有问题。根据您在做什么,您可能需要查找并使用词法扫描器。词法扫描器可以避免以下问题。

  1. 扫描文本

    /* Comment appears to have // a comment inside it */

    将匹配

    // a comment inside it */

  2. 扫描文本

    char* a = "string appears to have // a comment";

    将匹配

    // a comment";

答案 3 :(得分:0)

为什么你不能写

"//"|"/*"    {return(COMMENT);}