2011-08-22 13 views
1

私は、次の正規表現を書いた:jflex:なぜこの正規表現は一致しますか?私のレクサーで

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

私はデバッグモードでbyacc/jを実行し、それが次の行が正規表現と一致したことを述べています。
しかし、この正規表現はなぜこの行にマッチしますか?

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

私はまた、場合@には特殊文字ですが、それもマッチする、"///"\s*[^\@\s].*を試してみました。 o.O

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

編集:私は正規表現がjflex、ない byaccに/ jの内で使用されるものですみません。

回避策:jflex documentation私はどの\sエスケープシーケンスを見つけられませんでしたので、私はこの正規表現"///"[ \t\f]*[^@ \t\f].*を試み、それが働きました。 \sエスケープ文字はサポートされておらず、jflexによって暗黙に無視されているようです。

+0

私は精通しています任意のPCRE正規表現エンジン、_not_文字列 '一致します "/// @Service(バージョン=" 1.0.0" )" 'パターンを使用して:' /// \よ* [^ @ \ s]。* '(これはbyacc/j固有のものなので引用符を削除しました)。 –

+0

しかし、byacc/jで使われている正規表現はそうです。 –

+1

ええ、私はそれを理解しています:)私はちょうどあなたが正規表現の観点から、あなたが仮定していることをあなたに知らせたいと思っていました。 –

答えて

1

を使うので、エスケープしてみているエスケープされていますJFlexで、ちょうど手紙sを意味しました。バージョン1.5.0から、正規表現は期待どおりに動作するはずです。

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

0

正規表現が渡されているように\が実際に"///"s[^@s].*

は、二重バージョン1.5.0 \sは特別なエスケープシーケンスではなかったの前にこの問題を回避するには、正しい"///"\\s[^@\\s].*

+0

二重エスケープが機能していません。 :( –

関連する問題