Регулярное выражение для имени переменной
Я все еще использую [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]%
Но я не знаю, будет ли это проблемой для вас или нет!