2016-05-25 6 views
-2

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

+0

@ WiktorStribiżew. Не должно быть '[A-Za-z] [] [A-Za-z_ $ 0-9.] *'? –

+2

Вы действительно хотите, чтобы 'abc.def [12]' был единственным идентификатором? Потому что это похоже на доступ к члену, за которым следует доступ к массиву, который не должен быть единственным токеном. Или это просто совпадение и, скажем, 'abc].]] Def [' будет одинаково допустимым идентификатором на вашем языке? – sepp2k

+0

Я использую flex-bison для определения условия запроса (mongodb). Это на самом деле имя колун. Имена столбцов - это похожие объекты filelds. Мне нужно получить его как идентификатор и использовать его для создания запроса. – user3379281

ответ

0

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

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