带文件结尾的可选JFlex预测

时间:2012-07-30 04:48:35

标签: regex fitnesse jflex

我正在尝试使用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 $是一个真正的尾随上下文,文件末尾不算作行尾。

1 个答案:

答案 0 :(得分:0)

在这里看起来似乎并不需要。

据我所知,你正在寻找以大写字母开头的骆驼字,但可以包含数字,其中一个数字作为小写字母,每个驼峰必须是一个大写字母只有信。如果这是正确的,这个正则表达式应该适合你:

\b((?:[A-Z][a-z\d]+){2,})\b

(?:部分使括号不可捕获。

[A-Z][a-z\d]+确保正好一个大写字符后跟至少一个小写字符。

{2,}强制模式重复至少两次,以便至少产生一个驼峰。