2013-02-15 151 views
1

我是新來的正則表達式。我想使用正則表達式從postgreSQL jdbc URL檢索主機名。 假設postgreSQL的網址將是jdbc:postgresql://production:5432/dbname。我需要檢索「生產」,這是主機名。我想嘗試使用正則表達式,而不是使用Java分割函數。我試過正則表達式從Jdbc查找主機名url

Pattern PortFinderPattern = Pattern.compile("[//](.*):*"); 
    final Matcher match = PortFinderPattern.matcher(url); 
    if (match.find()) { 
     System.out.println(match.group(1)); 
    } 

但是它匹配所有從主機名到最後的字符串。請幫助我。

回答

1
Pattern PortFinderPattern = Pattern.compile(".*:\/\/([^:]+).*"); 
0
[//]([\\w\\d\\-\\.]+)\: 

應該是足夠可靠地找到它。雖然這可能是一個更好的正則表達式:

The Hostname Regex

1

正則表達式不進行分組:

"(?<=//)[^:]*" 
0

,我們在您的正則表達式的一些錯誤:

[//] - 這是隻有一個字符,這是因爲[]標記一個字符類,所以它不會完全匹配//。要匹配它,你需要這樣寫:[/][/]\/\/

(.*) - 這將匹配所有字符到行尾。如果你想去某個角色,你需要更具體。例如,您可以通過獲取所有不是冒號的字符來訪問冒號,如下所示:([^:]*)

:* - 這使冒號可選。我猜你忘了在冒號後面加上一個點(每個字符),如下所示::.*

所以這裏是你的正則表達式更正:\/\/([^:]*):.*

希望這會有所幫助。

BTW。如果端口號是在生產後可選(:5432),那麼我建議以下的正則表達式: \/\/([^/]*)(?::\d+)?\/

0

要捕獲還甲骨文和MySQL JDBC URL與他們的怪癖變種(如Oracle允許使用@,而不是//甚至@//),我用這個正則表達式得到主機名:[/@]+([^:/@]+)([:/]+|$)然後主機名在組1中。

代碼例如

String jdbcURL = "jdbc:oracle:thin:@//hostname:1521/service.domain.local"; 
Pattern hostFinderPattern = Pattern.compile("[/@]+([^:/@]+)([:/]+|$)"); 
final Matcher match = hostFinderPattern.matcher(jdbcURL); 
if (match.find()) { 
    System.out.println(match.group(1)); 
} 

這適用於所有這些URL(和其他變體):

jdbc:oracle:thin:@//hostname:1521/service.domain.local 
jdbc:oracle:thin:@hostname:1521/service.domain.local 
jdbc:oracle:thin:@hostname/service.domain.local 
jdbc:mysql://localhost:3306/sakila?profileSQL=true 
jdbc:postgresql://production:5432/dbname 
jdbc:postgresql://production/ 
jdbc:postgresql://production 

這假定

  • 主機名是//@或它們的組合(單/後也會起作用,但我不認爲JDBC允許這樣做)。

  • 在主機名:/後面或字符串的末尾跟在後面。

注意,在+是貪婪的,這是中間的一個特別重要的。