Regex 变量名的正则表达式

Regex 变量名的正则表达式,regex,expression,bison,flex-lexer,Regex,Expression,Bison,Flex Lexer,我仍然使用[A-Za-z][A-Za-z_u$0-9]作为捕获变量名的正则表达式(在bison flex中)。现在我想给它加上点和方括号。 例如,它可以是abc.def[12]。我该怎么做呢?我不知道bison flex,但我认为您正在寻找的正则表达式是: [A-Za-z][\w$]*(\[\w$]+)?(\[\d+])? 但这并不是全部,因为它将在其他无效变量名中匹配(正如上面注释中提到的所有其他模式一样) 例如,在字符串123abc.def[12]456中匹配abc.def[12]使用正则表

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

我不知道bison flex,但我认为您正在寻找的正则表达式是:

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

但这并不是全部,因为它将在其他无效变量名中匹配(正如上面注释中提到的所有其他模式一样)

例如,在字符串
123abc.def[12]456
中匹配
abc.def[12]
使用正则表达式时,需要非常小心误报

所以你需要一个锚,一个消极的向后看和向前看(bison flex允许这些吗?)。 最后一个正则表达式将如下所示:

反向查找
(?确保匹配的开始出现在不是\w(字字符)\d(数字)、点方括号或美元的字符上

对于负前瞻
(?![\w\d\.\[\]$])
也是如此,这确保匹配结束后紧接着的字符不是\w(单词字符)\d(数字)、点方括号或美元

匹配项列表:

  • abc.def[12]
  • abc.def
  • abcdef[12]
  • abc.def12
  • abc
  • abc_12
  • 美国广播公司_$
  • a_$
  • a_uu12.a_uu12
和一个不匹配的列表

  • _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]
,但我不知道这是否会对您造成问题!

@WiktorStribiżew。它不应该是
[a-Za-z][[a-Za-z][0-9]*
?您真的希望
abc.def[12]
成为一个单一标识符吗?因为它看起来像是一个成员访问,后跟一个数组访问,而数组访问不应该是一个单一的令牌。或者这只是巧合,比如说
abc]]]def[
在您的语言中也是一个同样有效的标识符?我使用flex bison来解析查询条件(mongodb)。它实际上是colunm名称。列名类似于对象文件。我需要将其作为标识符并用于创建查询。如果您不关心表单,只需使用上面建议的正则表达式,它匹配
abc.def[12]
btw.@user3379281:那么,尝试了
[A-Za-z][[A-Za-z][0-9]*