33

正規表現が言語間で共通していることは認識しています...しかし、Java 構文を書くのに問題があります。JS で次のようにコーディングされた正規表現があります。

if((/[a-zA-Z]/).test(str) && (/[0-9]|[\x21-\x2F|\x3A-\x40|\x5B-\x60|\x7B-\x7E]/).test(str))         
return true;

Java で同じものを書くにはどうすればよいですか?

輸入しました

import java.util.regex.Matcher;
import java.util.regex.Pattern;

追加するために、私が試していることから、 \x は無効なエスケープ文字であると言っています..

4

6 に答える 6

46

先頭と末尾の'/'文字をに変更し、それぞれを'"'に置き換えます。'\'"\\"

JavaScript、Perl、およびその他のスクリプト言語とは異なり、Java には正規表現用の特別な構文がありません。代わりに、(通常) Java 文字列リテラルを使用して表現されます。しかし'\'は Java 文字列リテラルのエスケープ文字であるため'\'、元の正規表現のそれぞれを 2 番目の でエスケープする必要があり'\'ます。(そして、正規表現にリテラルのバックスラッシュ文字がある場合は"\\\\"、Java 文字列リテラルになってしまいます!!)

これは、Java の初心者にとっては少し混乱/困難ですが、完全に論理的です。Java文字列リテラルを使用して正規表現を表現していることを覚えておいてください。


ただし、@antak が指摘しているように、Java と JavaScript によって実装される正規表現言語にはさまざまな違いがあります。したがって、任意の JavaScript 正規表現を (上記のように) Java に音訳すると、機能しない可能性があります。

相違点をまとめた参考文献をいくつか示します。

于 2012-01-06T07:00:33.700 に答える
3

あなたがしなければならない唯一のことは、バックスラッシュを複製することです。

Pattern p1 = Pattern.compile("[a-zA-Z]");
Pattern p2 = Pattern.compile("[0-9]|[\\x21-\\x2F|\\x3A-\\x40|\\x5B-\\x60|\\x7B-\\x7E]");

if (p1.matcher(str).find() && p2.matcher(str).find()) {
    return true;
}
于 2012-01-06T07:02:41.123 に答える
0

Java正規表現は何よりもまず文字列であるため、ではなく二重引用符で始める必要があります/\また、Javaでは、そのように2つを実行して、をエスケープする必要があります\\

詳細については、Oracleのこのチュートリアルを参照してください。

于 2012-01-06T07:03:54.507 に答える
0

Javascript と Java で同じ正規表現を使用する場合は、コンパイル時に正規表現を定義しようとするのではなく、実行時に正規表現文字列を取得してみてください。コンパイル時に構文がチェックされ、無効なエスケープ文字エラーが発生しますが、実行時には構文がチェックされず、パターンが直接コンパイルされます。

API から正規表現を取得するか、ローカルに保存されたテキスト ファイルから読み取ることができれば、それは素晴らしいことです。

于 2018-10-22T08:56:07.960 に答える