Как REGEX // в C? Однострочные комментарии - PullRequest
1 голос
/ 07 апреля 2011

Я использовал следующее, чтобы заставить его работать частично:

        %{
        #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})* не учитывает специальные символы.Как изменить регулярное выражение для размещения большего количества символов до конца строки?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2011

Не могли бы вы просто использовать

[/]+.*

Это будет соответствовать некоторому числу / , а затем чему угодно до конца строки. Конечно, это не распространяется на комментарии типа / * COMMENT * / .

1 голос
/ 10 февраля 2017

может быть поздно.Но я считаю, что более уместно использовать \/[\/]+.* Это будет охватывать двойную косую черту и многое другое, а затем весь остальной текст.

Ниже приведено объяснение regex101.com

\/ 

соответствует символу / буквально (с учетом регистра) Соответствует одному символу, присутствующему в тексте

[\/]+

+ Квантор - соответствует от одного до неограниченного количества раз, как можно больше развозвращая по мере необходимости (жадный) \/ соответствует символу / буквально (с учетом регистра) .* соответствует любому символу (кроме ограничителей строки)

0 голосов
/ 07 апреля 2011

Почему ты не можешь просто написать

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

...