1

私のレクサーで、私は次の正規表現を書きました:

"///"\s*[^@\s].*

デバッグモードでbyacc/jを実行しましたが、次の行が正規表現と一致したと表示されます。
しかし、なぜこの正規表現はこの行と一致するのですか?

/// @Service( version="1.0.0" )

特殊文字の"///"\s*[^\@\s].*場合も試してみましたが、一致します。@oO

私の正規表現は///、オプションの空白が後に続く文字列にのみ一致すると思いました。空白以外の文字よりも@、必ず来る必要があり、その後に任意の文字が続きます。

編集:申し訳ありませんが、正規表現はbyacc/jではなくjflex内で使用されています。

回避策:jflexのドキュメントでエスケープシーケンスが見つからなかったため\s、この正規表現を試してみまし"///"[ \t\f]*[^@ \t\f].*たが、機能しました。\sエスケープ文字はサポートされておらず、jflexによって黙って無視されているようです。

4

2 に答える 2

1

バージョン 1.5.0\sが JFlex の特別なエスケープ シーケンスではなく、単に文字s. バージョン 1.5.0 以降、正規表現は期待どおりに動作するはずです。

@は特殊文字ではなく、エスケープする必要はありません。

于 2015-04-16T20:34:33.940 に答える
0

渡される正規表現が実際に渡されるように\がエスケープされていますか"///"s[^@s].*

使用するようにダブルエスケープしてみてください"///"\\s[^@\\s].*

于 2011-08-22T10:54:07.827 に答える