我正在尝试使用JFlex为Fitnesse写一个词法分析器并且遇到了与WikiWords有关的问题(http://fitnesse.org/FitNesse.UserGuide.WikiWord)
我复制了链接的正则表达式,并使用以下正则表达式代码:
. # Regular character
[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ # WikiWord
我遇到麻烦ThisIsNotAWikiWord
。它连续有2个大写字母,因此它不应被视为常规字。所以我需要添加一个预测来检查下一个字符是字母还是数字。类似于[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ / [^A-Za-z0-9]
。
这适用于lexing ThisIsNotAWikiWord
,但它总体上打破了lexing WikiWords。当lexing WikiWord
时,前瞻没有额外的字符,所以它不匹配。
我想我想要一个可选的前瞻。如果在此之后有一个角色,那么最好不要成为其中之一。但如果输入中没有其他字符,那就让我们匹配。
文档让我相信这是不可能的,但我希望这只是我缺乏正则表达式。来自文档:
在词法规则中,正则表达式r后面可能跟有一个预见表达式。前瞻表达式是'$'(行尾操作符)或'/'后跟任意正则表达式。在这两种情况下,预测都不会被消耗,也不会包含在匹配的文本区域中,但在确定哪个规则具有最长匹配时会考虑前提(另请参见4.3.3输入如何匹配)。
在'$'的情况下,r仅在输入的一行末尾匹配。行的结尾由正则表达式\ r | \ n | \ r \ n | \ u2028 | \ u2029 | \ u000B | \ u000C | \ u0085表示。所以$相当于一个/ \ r | \ n | \ r \ n | \ u2028 | \ u2029 | \ u000B | \ u000C | \ u0085。这与[5]中描述的情况略有不同:因为在JFlex $是一个真正的尾随上下文,文件末尾不算作行尾。
答案 0 :(得分:0)
在这里看起来似乎并不需要。
据我所知,你正在寻找以大写字母开头的骆驼字,但可以包含数字,其中一个数字作为小写字母,每个驼峰必须是一个大写字母只有信。如果这是正确的,这个正则表达式应该适合你:
\b((?:[A-Z][a-z\d]+){2,})\b
(?:
部分使括号不可捕获。
[A-Z][a-z\d]+
确保正好一个大写字符后跟至少一个小写字符。
{2,}
强制模式重复至少两次,以便至少产生一个驼峰。