我仍然使用[A-Za-z][A-Za-z_$0-9]
作为捕获变量名称的正则表达式(在bison-flex中)。现在我想在其中添加点和方括号。
例如,它可能是abc.def[12]
。我该怎么办?
答案 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(一个数字)一个点方括号或一美元。
匹配列表:
非匹配列表
我再也不知道bison-flex,但要注意背后的外观和前瞻并不全面,例如abc.def[12]
的匹配将在字符串#abc.def[12]%
中找到但是我不会&#39;我知道这对你是否有问题!