Регулярное выражение для имени переменной

Я все еще использую [A-Za-z][A-Za-z_$0-9] как регулярное выражение для перехвата имени переменной (в bison-flex). Теперь я хочу добавить в него точку и квадратную скобку. Например, это может быть abc.def[12], Как мне это сделать?

1 ответ

Я не знаю, bison-flex, но я думаю, что вы ищете регулярное выражение:

[A-Za-z][\w$]*(\.[\w$]+)?(\[\d+])?

Но это не вся история, поскольку она совпадает с недопустимыми именами переменных (как и все другие шаблоны, упомянутые в комментариях выше).

Например будет соответствовать abc.def[12] внутри строки 123abc.def[12]456 Вы должны быть очень осторожны с ложными срабатываниями при работе с регулярными выражениями.

Так что вам нужен якорь, отрицательный взгляд назад и взгляд в будущее (позволяет ли это bison-flex?). Конечное регулярное выражение будет выглядеть примерно так:

(?<![\w\d\.\[\]$])[A-Za-z][\w$]*(\.[\w$]+)?(\[\d+])?(?![\w\d\.\[\]$])

Негативный взгляд позади (?<![\w\d\.\[\]$]) гарантирует, что начало совпадения происходит с символом, который не является \w (символ слова) \d (цифра), точечными квадратными скобками или долларом.

То же самое верно и для негативного взгляда в будущее. (?![\w\d\.\[\]$]) Это гарантирует, что за концом совпадения сразу же следует символ, который не является \w (символ слова) \d (цифра), точечными квадратными скобками или долларом.

список матчей:

  • abc.def [12]
  • abc.def
  • ABCDEF [12]
  • abc.def12
  • азбука
  • abc_12
  • ABC._$
  • а_ $
  • а_$12.a_$12

И список не соответствует

  • _abc
  • $ а
  • abc.def []
  • 12abc.def [12]
  • abc.def [12] 12
  • _abc.def [12]
  • $ Abc.def [12]
  • abc.def [12] $
  • [12] abc.def
  • аЬс [12].def

Опять же, я не знаю, bison-flex, но помните, что взгляд в будущее и взгляд в будущее не являются исчерпывающими, например, совпадение abc.def[12] будет найден в строке #abc.def[12]% Но я не знаю, будет ли это проблемой для вас или нет!

Другие вопросы по тегам