Я хочу исправить это регулярное выражение, чтобы сопоставить оба блока текста по отдельности

1
@@IF[- (<>%='@a-z0-9\r\n\t).:!_,+/""]+(@@END IF|@ENDIF)

Здравствуйте, я хочу исправить указанное выше регулярное выражение, чтобы сопоставить оба блока текста отдельно с помощью С#. На данный момент он рассматривает ниже как единый матч.

@@IF (<%=SHOPCODE%> == '2' ) THEN
return complicated if 
@@ELSE
Boo
@@END IF 

!

@@IF (<%=SHOPCODE%> == '1' )  THEN
County is UK
@@ELSE
Not UK
@@END IF
Теги:

2 ответа

3
Лучший ответ

Вы можете попробовать захватить группы вместе с Lazy способом.

(@@IF\b[\S\s]*?\r?\n@@?END ?IF)

Демо-версия

Объяснение Regex: (в соответствии с вашими потребностями вы можете изменить необязательно)

  (                        group and capture to \1:
    @@IF                     '@@IF'
    \b                       the word boundary
    [\S\s]*?                 any character (0 or more times (least possible))
    \r?                      '\r' (carriage return) (optional)
    \n?                      '\n' (newline)
    @                        '@'
    @?                       '@' (optional)
    END                      'END'
     ?                       ' ' (optional)
    IF                       'IF'
  )                        end of \1
  • 0
    \r?\n? бесполезно, \n будет лучше, или ^ с RegexOptions.Multiline .
  • 0
    @LucasTrzesniewski Я не знаю, что будет работать, поэтому я использовал и \r и \n . Я предложил изменить дополнительный согласно потребности.
Показать ещё 6 комментариев
1

Другой случай жадности...

Используйте неживые кванторы (и упростите регулярное выражение):

@@IF\s+.*?(?:@@END IF|@ENDIF)

Демо здесь: http://regex101.com/r/kV0tM5/1

Часть .*? будет соответствовать как можно меньше символов.

  • 0
    он не работает для .net - regexstorm.net/tester
  • 0
    @Jaycee Использовать RegexOptions.Singleline .
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню