变量名

时间:2016-05-25 15:51:43

标签: regex expression bison flex-lexer

我仍然使用[A-Za-z][A-Za-z_$0-9]作为捕获变量名称的正则表达式(在bison-flex中)。现在我想在其中添加点和方括号。 例如,它可能是abc.def[12]。我该怎么办?

1 个答案:

答案 0 :(得分:0)

我不知道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
  • abc_12
  • ABC ._ $
  • 一个_ $
  • A_ $ $ 12.a_ 12

非匹配列表

  • _abc
  • $ ABC
  • abc.def []
  • 12abc.def [12]
  • abc.def [12] 12
  • _abc.def [12]
  • $ abc.def [12]
  • abc.def [12] $
  • [12] abc.def
  • ABC [12] .DEF

我再也不知道bison-flex,但要注意背后的外观和前瞻并不全面,例如abc.def[12]的匹配将在字符串#abc.def[12]%中找到但是我不会&#39;我知道这对你是否有问题!