2013-10-24 58 views
0

我正在嘗試使用Java編程一個Minecraft Bukkit插件,該插件將查找何時將IP置於聊天中,因此我使用的是正則表達式。我需要的是正則表達式來查找字符串中的任何地方,一個字符後跟一個句點後跟另一個字符,如127.0.0.1是有效的,但它也需要能夠找到它周圍的任何字符,如This IP: 127.0.0.1 is your localhost IP。這是我當前的代碼:Java正則表達式查找任意字符串中的字符

Pattern p = Pattern.compile("[a-z1-9]" + "." + "[a-z1-9]"); 
Matcher matcher = p.matcher(message); 
if(matcher.matches()){ 
    player.sendMessage(plugin.prefix + "§7You cannot advertise an IP address!"); 
    event.setCancelled(true); 
} 

這個代碼將只搜索類似127.0並不僅如此,但正如我前面所說,我需要它來尋找任何字符串[letter/number].[letter/number]任何金額,如果這是有道理的。

+1

,應該閱讀一些[正則表達式教程](http://www.regular-expressions.info/tutorial.html),或在最少嘗試在提問之前搜索[regex for IP](http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address)。 '.'是特殊字符,意思是「除了新行標記之外的任何字符」和'[a-z1-9]'匹配範圍爲'az'或'1-9'的*一個*字符,所以您需要添加量詞。另外,如果你想匹配IPv4,那麼'a-z'在你的正則表達式中做了什麼? – Pshemo

+0

@Pshemo閱讀我的評論plsgogame的回答。 – DonkeyCore

+0

如果你還想找到像「jointhis.server.com」這樣的主機名,那麼你肯定應該閱讀我之前評論中鏈接的問題答案。 – Pshemo

回答

1

我需要的是正則表達式來查找字符串中的任何地方,一個字符後跟一個句點後跟另一個字符。我需要它來找到[字母/數字]的任何量。[字母/數字在任何一個字符串,如果這是有道理的......

你可以做這裏是用一個字邊界\b以匹配這些模式以較大的文字。

對於一個簡單的解決方案,你可以使用這樣的東西。

\\b((?:(?:[0-9]{1,3}\\.){3}[0-9]{1,3}|(?:[a-z0-9]+(?:-[a-z0-9]+)*\\.)+[a-z]{2,4}))\\b 

實施例:

import java.util.regex.*; 

class rTest { 
    public static void main (String[] args) { 
    String in = "Let's match 127.0.0.1 being valid, or this IP: 127.0.0.1 and joinTHIS.server.com or build 1.2"; 
    String re = "\\b((?:(?:[0-9]{1,3}\\.){3}[0-9]{1,3}|(?:[a-z0-9]+(?:-[a-z0-9]+)*\\.)+[a-z]{2,4}))\\b"; 
    Pattern p = Pattern.compile(re, Pattern.CASE_INSENSITIVE); 
    Matcher m = p.matcher(in); 
    while (m.find()) { 
     System.out.println(m.group(1)); 
    } 
    } 
} 

輸出

127.0.0.1 
127.0.0.1 
joinTHIS.server.com 
+0

太棒了!我改變了正則表達式(添加了一對夫婦*),並且它適用於IP,主機名以及我嘗試過的任何字符串。謝謝 :) – DonkeyCore

1

請閱讀本:link

PADDRESS_PATTERN = 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." + 
    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])"; 
+0

唯一的問題是在開始和結束時會出現'^'和'$',這會阻止它找到OP應用程序的IP地址。除此之外,這是一個非常好的答案。 –

+0

我真的很喜歡這個答案,它主要工作,但我也需要它,以便它可以在一個隨機拋出的地方在字符串中找到,也可以用字母處理,因爲一些IP可以使用自定義IP如jointhis.server.com或東西 – DonkeyCore

+0

@BenBarkay thx,固定。 – plsgogame

0

試試這個:

Pattern.compile("(\\d{1,3}\\.){3}\\d{1,3}"); 

這隻會找到4句點分隔的3位數字的序列。

編輯: plsgogame的答案包含了一個更好的模式來查找IP地址(它可能只包含0到255之間的數字)。

0

您的正則表達式匹配任何以[a-z0-9]開頭和結尾的長度爲3的字符串,因爲您不是逃避'。'。代表任何角色。而且,應該重複括號中的一組字符。例如,你可以使用類似:

[\d]*\.[\d]*\.[\d]*\.[\d]* 

它匹配一個或多個數字隨後一段三次,最後一個或多個數字。這意味着你會得到'123.456.789.101'形式的任何字符串的匹配,但也可以是'122533252.13242351432142.375547547.62463636'之類的東西,所以這不是完全有用的。

的改善,但並不完美,是如下:

[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d]\.[\d][\d][\d] 

將匹配由點分隔的三個數字組。

如果你想快進到一些更有趣和有效的,但也較難理解,如果你是一個初學者,你可以使用例如發現on this page,那就是:

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 

這不正是你需要什麼。此外,matches()方法試圖匹配所有的輸入,而不是它的一部分,所以你可以在正則表達式的開始和結尾添加一個'。*',並從java代碼運行它像這樣:

Pattern p = Pattern.compile(".*\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b.*"); 
Matcher matcher = p.matcher(message); 
if (matcher.matches()) System.out.println("It's a match"); 

如果你想找到所有你可以做,而不是IP地址:

Pattern p = Pattern.compile("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b"); 
Matcher matcher = p.matcher(message); 
while (matcher.find()) System.out.println("Match: " + matcher.group()); 

的正則表達式是美妙的,雖然學習曲線陡峭。所以祝你好運學習!

相關問題