我正试图使用JFlex为Fitnesse编写一个lexer,但在使用WikiWords时遇到了问题(http://fitnesse.org/FitNesse.UserGuide.WikiWord)
我复制了链接的正则表达式,并使用以下正则表达式作为标记:
. # Regular character
[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ # WikiWord
不过,我在正确拼写ThisIsNotAWikiWord
时遇到了问题。它有两个大写字母,所以它不应该被认为是一个正则词。所以我需要添加一个先行检查来检查下一个字符是字母还是数字。类似[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ / [^A-Za-z0-9]
的东西。
这对于词法分析ThisIsNotAWikiWord
来说很好,但它通常会破坏词法分析WikiWords。当词法分析WikiWord
时,前瞻没有额外的字符,因此它不匹配。
我想我想要一个可选的展望。如果在这之后有一个角色,那么它最好不是其中之一。但是,如果输入中没有其他字符,让我们进行匹配。
文档让我相信这是不可能的,但我希望这只是我缺少regex-fu。来自文档:
在词法规则中,正则表达式r后面可以跟一个先行表达式。先行表达式是"$"(行尾运算符)或后面跟着任意正则表达式的"/"。在这两种情况下,前瞻性都不会被消耗,也不会被包括在匹配的文本区域中,但在确定哪条规则具有最长的匹配时会考虑它(另请参见4.3.3如何匹配输入)。
在"$"的情况下,r只在输入中的一行末尾匹配。行的末尾由正则表达式\r\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085表示。因此,$相当于a/\r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085。这与[5]中描述的情况有点不同:因为在JFlex$中,它是一个真正的尾随上下文,所以文件结尾不算作行尾。
这里似乎不需要环视。
据我所知,您正在寻找以大写字母开头但可以包含数字的大小写单词,其中一个数字算作小写字母,每个大小写凸起必须只有一个大写字母。如果是这样的话,这个正则表达式应该对你有用:
b((?:[A-Z][a-zd]+){2,})b
(?:
部分使括号不被捕获。
[A-Z][a-zd]+
确保恰好有一个大写字符后紧跟至少一个写字符。
{2,}
强制模式至少重复两次,以便产生至少一个驼峰。