2017-04-17 153 views
-2

我有一些Python正則表達式,我需要轉換爲java。我知道我想要正則表達式做什麼,但我不知道如何轉換它。如何將python正則表達式轉換爲java正則表達式?

以下是python中的表達式:^172\.(1[6789]|2\d|30|31)\.。我希望它捕獲任何有點像172.X IP地址,其中X的範圍從16到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) 

,並適當地抓住我的期望:

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

但我試圖將這些轉換爲java,它不工作。看來我應該能夠轉換爲java正則表達式,只需將\添加到每個\即可正確轉義?像^172\\.(1[6789]|2\\d|30|31)\\.

但它仍然不符合我想要的方式。在這種情況下,我錯過了python和JAVA正則表達式之間的區別?

我沒有java代碼容易獲得,但我想這個工具:http://java-regex-tester.appspot.com/,我設定目標文本172.19.0.0和不匹配,但它確實「查找」。但是,當我輸入「blah」作爲目標文本時,它也會在「查找」部分放入某些東西...所以我不確定我是否相信這個工具http://java-regex-tester.appspot.com/,因爲它將任何字符串放在「查找」中,即使它是「嗒嗒」。

那麼,如何驗證我的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 @Andreas!對於'scala'也是如此? – jaja

+0

@jaja您應該仍然可以通過點擊複選標記來接受答案。對不起,我不認識斯卡拉。 – Andreas

相關問題