Я по-прежнему использую [A-Za-z][A-Za-z_$0-9]
как регулярное выражение для поиска имени переменной (в bison-flex). Теперь я хочу добавить в него точку и квадратную скобку. Например, это может быть abc.def[12]
. Как мне это сделать?Регулярное выражение для имени переменной
ответ
Я не знаю, бизон-флекс, но я думаю, что регулярное выражение вы ищете:
[A-Za-z][\w$]*(\.[\w$]+)?(\[\d+])?
Но это не вся история, как это соответствовало бы в противном случае недопустимых имен переменных (как сделайте все другие шаблоны, упомянутые в комментариях выше)
Например, в строке abc.def[12]
внутри строки 123abc.def[12]456
вам нужно быть очень осторожным с ложными срабатываниями при работе с регулярными выражениями.
Значит, вам нужен якорь, негативный внешний вид и смотреть вперёд (можно ли это сделать?). Окончательное регулярное выражение будет выглядеть примерно так:
(?<![\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 ._ $
- a_ $
- а_ $ 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].Защиту
Опять же я не знаю, бизон-флекс, но знать вид сзади и смотреть вперед, не являются исчерпывающими, например, матч abc.def[12]
будет найден в строке #abc.def[12]%
Но я не знаю, если это будет проблема для вас или нет!
@ WiktorStribiżew. Не должно быть '[A-Za-z] [] [A-Za-z_ $ 0-9.] *'? –
Вы действительно хотите, чтобы 'abc.def [12]' был единственным идентификатором? Потому что это похоже на доступ к члену, за которым следует доступ к массиву, который не должен быть единственным токеном. Или это просто совпадение и, скажем, 'abc].]] Def [' будет одинаково допустимым идентификатором на вашем языке? – sepp2k
Я использую flex-bison для определения условия запроса (mongodb). Это на самом деле имя колун. Имена столбцов - это похожие объекты filelds. Мне нужно получить его как идентификатор и использовать его для создания запроса. – user3379281