在字符串的结尾添加一个字符串特定字符串的String

问题描述:

里面我有一个包含几个字符串像下面这样的大串:在字符串的结尾添加一个字符串特定字符串的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 

我该如何解决我的问题?

您需要了解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

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) 
} 

你应该把它作为

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