0

我正在尝试使用 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 表示。所以a$等价于a / \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085。这与[5]中描述的情况有点不同:因为在JFlex $ 是一个真正的尾随上下文,文件结尾不计为行尾。

4

1 回答 1

0

环顾四周,这里似乎不需要什么东西。

据我了解,您正在寻找以大写字母开头但可以包含数字的驼峰式单词,其中数字算作小写字母,并且每个驼峰凸点只能是一个大写字母。如果这是正确的,这个正则表达式应该适合你:

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

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

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

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

于 2012-07-30T06:39:56.147 回答