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]

これは lexingThisIsNotAWikiWordには問題なく機能しますが、一般的に lexing WikiWords を壊します。lexingWikiWordの場合、先読み用の余分な文字がないため、一致しません。

オプションの先読みが必要だと思います。この後に文字がある場合は、これらのいずれでもない方がよいでしょう。しかし、入力に別の文字がない場合は、一致させましょう。

ドキュメンテーションは、これは不可能だと私に信じさせますが、それが私の正規表現の欠如であることを望んでいます。ドキュメントから:

字句規則では、正規表現 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 $ は真の後続コンテキストであり、ファイルの終わりは行の終わりとしてカウントされません。

4

1 に答える 1

0

周りを見回すのは、ここでは必要ないようです。

私が理解している限り、大文字で始まるが数字を含むことができるキャメルケースの単語を探しています。数字は小文字としてカウントされ、各キャメルバンプは大文字のみである必要があります。それが正しければ、この正規表現はあなたのために働くはずです:

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

この(?:部分は、括弧を非キャプチャーにします。

[A-Z][a-z\d]+1 つの大文字の後に少なくとも 1つの小文字が続くことを確認します。

{2,}ラクダのこぶが少なくとも 1 つ生成されるように、パターンを少なくとも 2 回繰り返すように強制します。

于 2012-07-30T06:39:56.147 に答える