2012-05-12 8 views
0

簡体字のJavaコンパイラを作成しています。私は変数名の正規表現を書いた: "(_?[a-zA-Z] + [\ w] *)"望ましいパターンに適合し、別のパターンに適合しない正規表現を書くにはどうすればよいですか?

と私は名前を特定の単語、intのようにすることはできません、true、false ...

^を試しましたが、動作しません。

+0

?それもJavaだと、Java独自のコンパイラを使用するだけではどうですか? – BalusC

答えて

1

これは正規表現で行うべきではなく、むしろHashSet<String>を使って行うほうが良いと思われ、セットに含まれている識別子名を除外します。

1

これはREで行うことはできますが、人間が書き込むことは容易ではありません。スキャナでキーワードを識別子として扱い、後でトークナイザの識別子とキーワードを区別します。それははるかに簡単であるはずです。

1

^は、他の何かのために使用されます。

^は、行の先頭に発生 に一致を必要とするように、パターンの先頭に表示されることがあります。たとえば、^ abcは abc123に一致しますが、123abcには一致しません。

は、 "(?!...)" を使用して考えてみます(?!...)

それは 指定されたパターンが存在しないことを必要とするため、負の先読みです。

私はそれが不可能または難しい場合は、代わりに実際のコーディングに行くことをお勧めします。時には、正規表現は実際の最適化されたコードよりもはるかに遅くなる可能性があり、非常に混乱する可能性があります。あなたの正規表現を試すため

、この1つのチェック:迅速な参照のために http://gskinner.com/RegExr/

を、この1点を確認してください。あなたはJavaコンパイラを書こうとしているどのような言語では http://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm

+0

OPは、BOLアサーションの代わりに否定を設定することを意味すると思います。また、実際には、正しく実装されたREは「最適化」されたコードよりも遅く実行されることは期待できません。実際には、REから生成された最小のDFAが期待できる最も最適化されたコードです(例:http://swtch.com/~rsc/regexp/regexp1.html(および第II部および第III部)。同じ) – zzzz

+0

確かに、それはすべてケースに依存します。実際のコードは正規表現よりもマッチするルールの「パワー」が強く、実際のコードと同じように、正規表現が悪いとチェックが非常に遅くなることに注意してください。例:http://www.youtube.com/watch?feature=player_detailpage&v=wbp-3BJWsU8#t=1079s –

+0

正規表現はこれに責任を負わない。代わりに、Javaの実装が大きく壊れているように見えます。このコードは私のマシンで実行するのに22ミリ秒かかる:http://play.golang.org/p/0sVG_9GA1V – zzzz

関連する問題