2016-03-04 121 views
0

裏面我有一個包含幾個字符串像下面這樣的大串:在字符串的結尾添加一個字符串特定字符串的String

http://website.com/image.jpg,我想補充?w=100他們每個人。

到目前爲止,我曾想過創建一個正則表達式,每次遇到該字符串時,它都會將其替換爲相同的字符串,並將其添加到?w=100中。

這裏是String的擴展,替換字符串:

public func stringByReplacingMatches(matchRegEx: String, withMatch: String) -> String { 
    do { 
     let regEx = try NSRegularExpression(pattern: matchRegEx, options: NSRegularExpressionOptions()) 
     return regEx.stringByReplacingMatchesInString(self, options: NSMatchingOptions(), range: NSMakeRange(0, self.characters.count), withTemplate: withMatch) 
    } catch { 
     fatalError("Error in the regular expression: \"\(matchRegEx)\"") 
    } 
} 

這是我如何使用它:

myString.stringByReplacingMatches("https:\\/\\/website\\.com\\/[\\w\\D]*.jpg", withMatch: "https:\\/\\/website\\.com\\/[\\w\\D]*.jpg?w=100")) 

問題,這是我替換字符串後得到:

https://website.com/[wD]*.jpg?w=100 

我該如何解決我的問題?

回答

1

您需要了解capture groups

myString.stringByReplacingMatches("(https:\\/\\/website\\.com\\/[\\w\\D]*.jpg)", withMatch: "$1?w=100") 

哦,不要忘記保存返回值

let fixedString = myString.stringByReplacingMatches("(https:\\/\\/website\\.com\\/[\\w\\D]*.jpg)", withMatch: "$1?w=100") 

myString不會改變,但是會fixedString有所有的更新。


UPDATE

[\\w\\D]*任何字符匹配。你需要制定一個更具體的正則表達式。

對於輸入"https://website.com/x.jpg" "https://website.com/x.jpg",正則表達式\w有效。

var myString = "\"https://website.com/x.jpg\" \"https://website.com/x.jpg\"" 
myString = myString.stringByReplacingMatches("(https:\\/\\/website\\.com\\/\\w*.jpg)", withMatch: "$1?w=100") 

但是,這不適用於每個可能的URL。

+0

爲什麼你需要一個捕獲組,如果你可以使用'$ 0'來插入匹配的字符串? – paulvs

+0

@paulvs我更喜歡明確。 「$ 0」可行,但不夠靈活。 –

+0

它的工作表示感謝,但僅限於最後一次發生。我怎樣才能使它適用於我的大串中的所有事件?我想正則表達式很好,這可能是函數。 – Nico

0
do { 
    let regex = try NSRegularExpression(pattern: "http:\\/\\/[a-z]*.[a-z]*\\/[a-z]*.[a-z]*", options: .CaseInsensitive) 
    var newString = regex.stringByReplacingMatchesInString(a, options: NSMatchingOptions(rawValue: 0), range: NSMakeRange(0, a.characters.count), withTemplate: "$0?w=100") 
    print(newString) 
} 
1

你應該把它作爲

myString.stringByReplacingMatches("https:\\/\\/website\\.com\\/[\\w\\D]*.jpg", withMatch: "$0?w=100")) 

模板可以使用$0顯示匹配的字符串。你不應該在那裏重複匹配正則表達式。

+0

它的工作感謝,但只爲最後一次發生。我怎樣才能使它適用於我的大串中的所有事件?我想正則表達式很好,這可能是函數。 – Nico

+0

您的匹配表達過於寬泛。試試'myString.stringByReplacingMatches(「http:\\/\\/[a-zA-Z0-9] *。[a-zA-Z0-9] * \\/[a-zA-Z0-9] *。 [a-zA-Z0-9] *「,withMatch:」$ 0?w = 100「))'這可能適用於某些URL,但我會尋找更好的正則表達式來檢測所有不同類型的URL。對於您的原始問題,模板更改是正確的解決方案。大字符串中URL的正確匹配完全是一個不同的問題。 – wottle

+0

是的,我後來意識到了......我最終使用了這個正則表達式:[\\ w - $ +()*!'] *。可能需要獲得更好的一個。謝謝 – Nico

相關問題