2015-11-08 41 views
4

我很困惑Java的正則表達式是如何工作的。我想從一個看起來像這樣的圖案中提取兩個字符串:Java正則表達式 - 如何獲取空格和字符?

String userstatus = "username = not ready"; 

Matcher matcher = Pattern.compile("(\\.*)=(\\.*)").matcher(userstatus); 
System.out.println(matcher.matches()); 

但是,打印這將返回false。我想獲取用戶名,以及它後面的空格和等號右邊的狀態字符串,然後將它們分別存儲到兩個字符串中。

我該怎麼做?謝謝!

所以生成的字符串應該是這樣的:

String username = "username "; 
String status = " not ready"; 
+0

可能更好的方法是將字符串拆分到'='處,檢查是否有確切的兩個對象返回,然後修剪兩個對象。 – luk2302

+1

當你在一個正則表達式的'.'之前加一個反斜槓時,它意味着一個文字'.'而不是「匹配任何字符」。所以你的正則表達式匹配「任意數量的點,等號,任意數量的點」。 – RealSkeptic

回答

3

首先,我假設你這樣做是爲了學習正則表達式,因爲非正則表達式的解決方案更容易實現和理解。

你的解決方案的問題是,你正在逃避的點,告訴正則表達式引擎,你想要匹配字面上點'.',而不是「任何字符」。一個簡單的修正這個問題是消除\\

(.*)=(.*) 

Demo.

這會工作,但它並不理想。更好的方法是說「符合一切,除了=,像這樣:

([^=]*)=(.*) 

Demo.

+0

是的,我絕對想學更多的正則表達式,因爲我會在更復雜的情況下需要它。謝謝您的幫助! – Mayron

2

您可以使用Stringsplit()方法。

String[] parts = userstatus.split("="); 
String username = parts[0]; 
String status = parts[1]; 
0

-如果取2 String=作爲分離點的問題,那麼我認爲regex將是矯枉過正了。

-可以使用split()方法來處理這個問題。

String lhs_Str = userstatus.split("=")[0] 
String rhs_Str = userstatus.split("=")[1] 
3

隨着\\.*你要匹配零個或多個點的字符所以表達式"(\\.*)=(\\.*)"實際上希望像..=...=。任何字符的通配符都是簡單的.。要修復您的代碼,您可以將正則表達式更改爲"(.*)=(.*)",這可以匹配=符號之前的所有字符以及之後的所有字符。

但是,這個解決方案是醜陋的,不是做這項工作的最佳方法。如果要提取=符號的左側和右側的內容,最好的方法是使用split方法。