2017-04-17 9 views
-2

私はPythonでいくつかの正規表現をjavaに変換する必要があります。私は正規表現に何をするかを知っていますが、変換する方法はわかりません。python regexをjava正規表現に変換するには?

ここはPythonの式です:^172\.(1[6789]|2\d|30|31)\.です。

import re 
pattern='^172\\.(1[6789]|2\\d|30|31)\\.' 
test_strings = ['172.19.0.0', '172.24.0.0', '172.45.0.0', '172.19.98.94'] 
for string in test_strings: 
    print re.findall(pattern, string) 

、それは適切に私が何を期待キャプチャ:私はそれはXが16から31

これはpythonで働くの範囲172.XのようなIPアドレスの任意の並べ替えをキャプチャしたい

['19'] 
['24'] 
[] 
['19'] 

しかし、私はこれらをjavaに変換しようとしましたが、うまくいきません。正常にエスケープするために\を各\に追加するだけで、Java正規表現に変換できるはずですか? like ^172\\.(1[6789]|2\\d|30|31)\\.

しかし、それでも私が望む方法と一致しません。この場合、PythonとJAVAの正規表現の違いについて私は何が分かりませんか? http://java-regex-tester.appspot.com/、と私は172.19.0.0に対象のテキストを設定し、それが一致していないが、それは「検索」ん:

私はjavaコードが容易に入手できていないが、私は、このツールを試してみました。しかし、ターゲットテキストとして "blah"を入力すると、 "Find"セクションに何かが置かれます。このツールhttp://java-regex-tester.appspot.com/を信頼しているとは確信していません。 "blah"

Java正規表現が正しいことを確認するにはどうすればよいですか?

+2

「が、それはまだ私が望むように一致していない」私たちは、あなたがJavaでこの正規表現を使用しているかを正確に確認することができますか?あなたのインプット、期待される結果、実際の結果は何ですか? – Pshemo

+0

Pythonでどのように使用されているのか分かりますか? –

+0

*推測:*あなたは 'matches()'を使っています。これは、*入力全体と常に一致するためです。 ['find()'](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#find--)を使用してください。 – Andreas

答えて

1

のJava 8はfindall()と同等のものを持っていないので、あなたはあなた自身のfind()ループを記述し、このように、Listに結果を収集する必要があります。

Pattern pattern = Pattern.compile("^172\\.(1[6789]|2\\d|30|31)\\."); 
String[] test_strings = {"172.19.0.0", "172.24.0.0", "172.45.0.0", "172.19.98.94"}; 
for (String string : test_strings) { 
    List<String> list = new ArrayList<>(); 
    for (Matcher matcher = pattern.matcher(string); matcher.find();) 
     list.add(matcher.group(1)); 
    System.out.println(list); 
} 

出力

[19] 
[24] 
[] 
[19] 

もちろん、あなたの正規表現はと一致することがあります。と一致するコードは、実際には

Pattern pattern = Pattern.compile("^172\\.(1[6789]|2\\d|30|31)\\."); 
String[] test_strings = {"172.19.0.0", "172.24.0.0", "172.45.0.0", "172.19.98.94"}; 
for (String string : test_strings) { 
    Matcher matcher = pattern.matcher(string); 
    if (matcher.find()) 
     System.out.println(matcher.group(1)); 
    else 
     System.out.println(); 
} 

出力

19 
24 

19 
+0

私は年齢ではありません投票、しかし+1 @アンドレアス!これはスカラーにとっても同じですか? – jaja

+0

@jajaまた、チェックマークをクリックして回答を受け入れることができます。申し訳ありませんが、スカラは分かりません。 – Andreas