RegExが言語間で共通であることを知っています...しかし、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は無効なエスケープ文字です。
先頭と末尾の'/'
文字を'"'
に変更し、各'\'
を"\\"
に置き換えます。
JavaScript、Perl、その他のスクリプト言語とは異なり、Javaには正規表現の特別な構文はありません。代わりに、それらは(通常)Java stringを使用して表現されますただし、'\'
はJava文字列リテラルのエスケープ文字であるため、元の正規表現の各'\'
は2番目の'\'
でエスケープする必要があります。 。(正規表現にリテラルのバックスラッシュ文字がある場合、Java文字列リテラル!!)に"\\\\"
が含まれます。)
これは、Java初心者にとっては少しわかりにくい/気の遠くなるような方法ですが、完全に論理的です。Java正規表現を表す文字列リテラル。
ただし、@ antakが注記しているように、JavaとJavaScriptの正規表現言語の間にはさまざまな違いがあります。そのため、任意のJavaScript正規表現を取得してJava as上記では、機能しない可能性があります。
違いをまとめた参考資料をいくつか紹介します。
https://regex101.com のようなonline regex evaluatorsを変換に使用できます。
ECMAScript (JavaScript) FLAVOR
を選択しますTOOLS -> Code Generator (LANGUAGE - Java)
筋金入りのプログラマーの方法ではありませんが、エラーが発生しにくくなっています。特に、1つまたは2つの式のみを変換する必要がある場合。
あなたがしなければならない唯一のことはバックスラッシュを複製することです。
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;
}
JavaでJavascriptの正規表現セマンティクスが本当に必要な場合、1つのアプローチは、組み込みJavascriptエンジンを使用して正規表現を評価することです。例えば:
javax.script.ScriptEngineManager se = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = se.getEngineByName("js");
String regExp = "/^\\d+$/";
engine.put("str", "1234");
engine.eval("var rgx=" + regExp);
Object value = engine.eval(
"function validate(r, s){ return (r).test(s);};validate(rgx, str);");
logger.log(value);
Java正規表現は最初の文字列であるため、/
ではなく、二重引用符で始める必要があります。また、Javaでは、\
のように2つ実行して、\\
をエスケープする必要があります。
詳細については、Oracleの this チュートリアルをご覧ください。
JavaScriptでJavaと同じ正規表現を使用する場合は、コンパイル時に正規表現を定義するのではなく、実行時に正規表現文字列を取得するようにしてください。コンパイル時に、構文を使用すると、無効なエスケープ文字エラーが発生しますが、実行時には構文がチェックされず、パターンが直接コンパイルされます。
APIから正規表現を取得できる場合、またはローカルに保存されたテキストファイルからそれを読み取ることができる場合、それは素晴らしいことです。