2012-01-06 15 views
12

regExは多くの言語で共通していることに気付いています...しかし、私はJavaの構文を書くのに問題があります。 JSでコード化された正規表現があります。Javascriptの正規表現をJavaの構文に変換する

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

Javaでどのように記述すればよいですか?私はただ、無効なエスケープ文字が何であるか、私はそれをしようとしています\ xを言っているから、追加する

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

をインポートした

..

答えて

27

変更大手と'"''/'文字を末尾、および各'\'"\\"に置き換えます。

Javascript、Perlなどのスクリプト言語とは異なり、Javaには正規表現の特殊な構文はありません。代わりに、Java文字列リテラルを使用して表現されます(通常は)。しかし、'\'はJava文字列リテラルのエスケープ文字なので、元の正規表現の各'\'は2番目の'\'でエスケープする必要があります。 (正規表現に文字通りの円記号があると、Javaの文字列リテラルには"\\\\"という名前になります!!)

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


しかし、@antakは、JavaとJavascriptの正規表現言語にはさまざまな違いがあります。したがって、Javascriptの正規表現を取り上げて上記のようにJavaに字体変換すると、動作しない可能性があります。

ここに、相違点をまとめた参考資料があります。

+0

Thxたくさん...私は2番目の部分を取得していません...それぞれの '\'を '\'に置き換える.....それらは同じではありませんか? – testndtv

+0

@testndtv - 私は "2番目のバックスラッシュで**エスケープしなければならない"と言いました。私は交換する必要があるとは言いませんでした。 –

+0

私は答えをブックマークする方法があったと思う...待って、決して気にしないでください。ブックマーク。とりあえずありがとう。 – hypd09

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; 
} 
+0

Thxたくさん... if ...行の構文エラーが発生しました – testndtv

+1

@testndtv:エラーを表示せずにエラーが発生しているとは言いませんメッセージ。 –

+0

2番目の 'find()'呼び出しがありませんでした。やってみよう。 –

0

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

詳しくは、Oracleのthisチュートリアルをご覧ください。

+1

正規表現エンジン自体ではなく、正規表現を消費する必要がある 'matches()'メソッドです。あたかも両端にアンカーされているかのように、文字列全体。 'find()'メソッドはより伝統的なマッチを行いますが、 'matches()'と同様にStringオブジェクトから呼び出すことはできません。 [AlexR did](http://stackoverflow.com/a/8754491/20938)のようなMatcherオブジェクトを明示的に作成する必要があります。 –

+0

@AlanMoore:私に知らせてくれてありがとう。私はほとんどfindを使用していない、私はほとんど常に 'matches()'を使用している。私は自分の答えからそのセクションを削除しました。 – npinti

1

私はこれが参考になるかもしれないと思います。 Javaでは、javaからjavascriptを実行するクラスがあります。どんな考えも歓迎です。

javax.script.ScriptEngineManager se = new javax.script.ScriptEngineManager(); 
     javax.script.ScriptEngine engine = se.getEngineByName("js"); 

String regExp = "/^\\d+$/";<br> 
engine.put("str", "1234");<br> 
engine.eval("var rgx="+regExp);<br> 
Object value = engine.eval("function validate(r, s){ return (r).test(s);};validate(rgx, str);");<br> 
logger.log(value); 
関連する問題