2012-12-26 44 views
4

所以我myString其中包含字符串簡單的Java正則表達式匹配和替換

"border-bottom: solid 1px #ccc;width:8px;background:#bc0b43;float:left;height:12px" 

我想用正則表達式來檢查它包含"width:8px" (\bwidth\s*:\s*(\d+)px)

如果爲真,增加寬度值(即8上面的例子)my myList。

嘗試:

if (myString.contains("\\bwidth\\s*:\\s*(\\d+)px")) { 
    myList.add(valueofwidth) //unsure how to select the width value using regex 
} 

任何幫助嗎?

編輯:所以我看着contains方法,發現它不允許正則表達式。 matches將允許正則表達式,但它會尋找一個完整的匹配。

回答

5

您需要使用Matcher#find()方法。

從文檔: -

嘗試查找 模式匹配的輸入序列的下一個子。

然後你就可以得到拍攝組出來的: -

Matcher matcher = Pattern.compile("\\bwidth\\s*:\\s*(\\d+)px").matcher(myString); 

if (matcher.find()) { 
    myList.add(matcher.group(1)); 
} 
+0

謝謝。你能告訴我更多關於'matcher.group(1)'嗎?我相信他們被稱爲捕獲組? – meiryo

+0

你不需要*使用'matcher.find()'。你可以*使用它,如果你喜歡寫繁瑣的代碼。 – Bohemian

+1

是的,你是對的。 '(\\ d +)'被稱爲捕獲組。捕獲的組按照開頭括號的順序編號。因此,由於((\\ d +)'具有第一個開頭括號,所以它是第一個捕獲組。並且要使用'Matcher#group'方法獲取在一個組中捕獲的值,並將組編號作爲參數。 –

2

你的主要問題是不接受正則表達式,它接受一個文字字符串。
matches()另一方面確實接受正則表達式參數,但必須匹配整個字符串以返回true。

接下來,一旦你有你的比賽,你可以使用replaceAll()提取目標內容:

if (myString.matches(".*\\bwidth\\s*:\\s*\\d+px.*")) { 
    myList.add(myString.replaceAll(".*\\bwidth\\s*:\\s*(\\d+)px.*", "$1")) 
} 

該命令替換組#1的內容,其原來的正則表達式捕獲整個輸入字符串。

請注意,我從原始匹配的正則表達式中刪除了多餘的括號,但留下了替換以捕獲目標內容。

4

你必須使用一個匹配器和matcher.find():

Pattern pattern = Pattern.compile("(\\bwidth\\s*:\\s*(?<width>\\d+)px)"); 
Matcher matcher = pattern.matcher(args); 
while (matcher.find()) { 
    myList.add(matcher.group("width"); 
}