2016-09-02 2 views
0

Javaパッケージ名を検証するために、javascriptで正規表現を使用したいと考えています。JavascriptでJavaパッケージ名を検証する正規表現

それを行うための最も簡単な方法は、単語やドットのリストを一致させることですので、私は、この正規表現を実装している:

(^(?:[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$) 

この正規表現次のことを確認してください。

  1. をパッケージ名ことができます文字、数字、ドット、アンダースコアのみで構成されます。
  2. パッケージ名は常に(またはundersccore付き)の単語でを起動する必要がありますが、決して数字を持つか、パッケージ名が、必要に応じてがで作られたパターンの配列を含むことができ、ドット
  3. と:ドットで始まり、数字で始まらない英字とアンダースコアで始まる単語が続きます。
  4. パッケージ名は、ドット文字以外で常にで終わらなければなりません。

    com 
    com.test 
    com.test.regex 
    _com._123 
    comTest.regEx 
    
    :パッケージ名は、慣例により小文字でを起動する必要があります

例えばこの正規表現マッチこれらのパッケージ名を(Javaのは、彼らが推奨されていても、大文字開始パッケージ名を許可します)

そして、それはこれらのパッケージ名をdoesnt'match:これは正しいです

123 
com. 
.com 
test.123com 
test.123_ 

が、 1つの単語がJava予約語の場合は、すべてのパッケージ名を無効にする必要があるため、私の目的には十分ではありません。

のは、一例として、このパッケージの名前を見てみましょう:このパッケージ名は私の正規表現で有効なものとして認識されている

com.test.package 

が、言葉packageは、Javaの予約語であり、それは、Javaのために使用することはできませんパッケージ名。

有効なパッケージ名を指定できます

com.test.packageTest 
com.test.testpackage 

単語packageは別の単語のサブすることができますが、それは、ドット間の単一の単語にすることはできません。

正規表現を修正して、Java予約語の使用を避けて、これらの規則で単一単語の検証を追加するにはどうすればよいですか?

ありがとうございました

+0

http://stackoverflow.com/questions/5205339/regular-expression-matching-fully-qualified-class-namesがあなたを助けます –

+2

あなたはおそらくネガティブな先読みを使用するつもりですJavaのすべてのキーワードをカバーします。私は、文字列演算と正規表現の組み合わせを使用することをお勧めします。あなたの現在の正規表現はそのままにして、点で分割し、各部分がキーワードでないことを確認してください。 –

+0

ええ、それは練習の解決です:すべての用語が予約語であるかどうか確認してください。おそらく、このチェックを正規表現で直接行うのは複雑すぎるでしょう。 –

答えて

1

私は正規表現を見つけたと思います。

私はこの1つを構築しているし、それが完璧に動作します:

(?!^abstract$|^abstract\..*|.*\.abstract\..*|.*\.abstract$|^assert$|^assert\..*|.*\.assert\..*|.*\.assert$|^boolean$|^boolean\..*|.*\.boolean\..*|.*\.boolean$|^break$|^break\..*|.*\.break\..*|.*\.break$|^byte$|^byte\..*|.*\.byte\..*|.*\.byte$|^case$|^case\..*|.*\.case\..*|.*\.case$|^catch$|^catch\..*|.*\.catch\..*|.*\.catch$|^char$|^char\..*|.*\.char\..*|.*\.char$|^class$|^class\..*|.*\.class\..*|.*\.class$|^const$|^const\..*|.*\.const\..*|.*\.const$|^continue$|^continue\..*|.*\.continue\..*|.*\.continue$|^default$|^default\..*|.*\.default\..*|.*\.default$|^do$|^do\..*|.*\.do\..*|.*\.do$|^double$|^double\..*|.*\.double\..*|.*\.double$|^else$|^else\..*|.*\.else\..*|.*\.else$|^enum$|^enum\..*|.*\.enum\..*|.*\.enum$|^extends$|^extends\..*|.*\.extends\..*|.*\.extends$|^final$|^final\..*|.*\.final\..*|.*\.final$|^finally$|^finally\..*|.*\.finally\..*|.*\.finally$|^float$|^float\..*|.*\.float\..*|.*\.float$|^for$|^for\..*|.*\.for\..*|.*\.for$|^goto$|^goto\..*|.*\.goto\..*|.*\.goto$|^if$|^if\..*|.*\.if\..*|.*\.if$|^implements$|^implements\..*|.*\.implements\..*|.*\.implements$|^import$|^import\..*|.*\.import\..*|.*\.import$|^instanceof$|^instanceof\..*|.*\.instanceof\..*|.*\.instanceof$|^int$|^int\..*|.*\.int\..*|.*\.int$|^interface$|^interface\..*|.*\.interface\..*|.*\.interface$|^long$|^long\..*|.*\.long\..*|.*\.long$|^native$|^native\..*|.*\.native\..*|.*\.native$|^new$|^new\..*|.*\.new\..*|.*\.new$|^package$|^package\..*|.*\.package\..*|.*\.package$|^private$|^private\..*|.*\.private\..*|.*\.private$|^protected$|^protected\..*|.*\.protected\..*|.*\.protected$|^public$|^public\..*|.*\.public\..*|.*\.public$|^return$|^return\..*|.*\.return\..*|.*\.return$|^short$|^short\..*|.*\.short\..*|.*\.short$|^static$|^static\..*|.*\.static\..*|.*\.static$|^strictfp$|^strictfp\..*|.*\.strictfp\..*|.*\.strictfp$|^super$|^super\..*|.*\.super\..*|.*\.super$|^switch$|^switch\..*|.*\.switch\..*|.*\.switch$|^synchronized$|^synchronized\..*|.*\.synchronized\..*|.*\.synchronized$|^this$|^this\..*|.*\.this\..*|.*\.this$|^throw$|^throw\..*|.*\.throw\..*|.*\.throw$|^throws$|^throws\..*|.*\.throws\..*|.*\.throws$|^transient$|^transient\..*|.*\.transient\..*|.*\.transient$|^try$|^try\..*|.*\.try\..*|.*\.try$|^void$|^void\..*|.*\.void\..*|.*\.void$|^volatile$|^volatile\..*|.*\.volatile\..*|.*\.volatile$|^while$|^while\..*|.*\.while\..*|.*\.while$)(^(?:[a-z_]+(?:\d*[a-zA-Z_]*)*)(?:\.[a-z_]+(?:\d*[a-zA-Z_]*)*)*$) 

この正規表現は、次のことを確認します。

  1. をパッケージ名は起動および/または単一の予約語
  2. で終わっていなければなりませんパッケージ名にドットの間に予約語を含めることはできません。

私はそれをwiでテストしましたth:

while1.package2.void3.transient4 

となります。

+0

私が見たメンテナンス可能なコードではありませんが、それを動作させるためには良いです:-) –

+0

ええ、わかっています...副次的な効果は、Javaの予約語の定数が正規表現に直接存在することです。 –