Swift中使用正则表达式替换字符串

10

我希望能够替换符合正则表达式模式的字符串部分。

我的正则表达式模式如下:

(.+?)@test\.(.+?)

这是一个字符串替换模式:

$1@hoge\.$2

如何在Swift代码中使用它们?
1个回答

16
在Swift中,您可以使用stringByReplacingMatchesInString进行基于正则表达式的替换。
以下是一个代码片段展示如何使用它:
let txt = "myname@test.com"
let regex = NSRegularExpression(pattern: "([^@\\s]+)@test\\.(\\w+)", options:nil, error: nil)
let newString = regex!.stringByReplacingMatchesInString(txt, options: nil, range: NSMakeRange(0, count(txt)), withTemplate: "$1@hoge.$2")
println(newString)

Swift 4.2 更新:

let txt = "myname@test.com"
let regex = "([^@\\s]+)@test\\.(\\w+)"
let repl = "$1@hoge.$2"
print( txt.replacingOccurrences(of: regex, with: repl, options: [.regularExpression]) )

请注意,我已将正则表达式更改为:

  • ([^@\\s]+) - 匹配除了@或空格之外的1个或多个字符。
  • @ - 匹配字面上的@
  • test\\.(\\w+) - 匹配字面上的test.,然后是1个或多个字母数字字符(\w+)。

请注意,在替换字符串中,您不需要转义句点。


我写了一个带有闭包的正则表达式替换方法:http://eon.codes/blog/2017/08/03/regex-replace-with-closure/ - Sentry.co
@GitSync 我认为当前的问题不需要使用启用闭包的正则表达式来解决。当然,这对其他人可能有所帮助。 - Wiktor Stribiżew
@WiktorStribiżew 完全同意使用闭包解决这个问题有点过头。但是我在 Stack 或 Google 上找不到关于用闭包替换的任何信息,所以我想提一下。 - Sentry.co
如何修改那些替换字符串"$1","$2"呢?例如,"$1".upperCasingFirstLetter()无法正常工作,因为编译器看到的是"$1"而不是替换后的字符串。 - undefined
@Chris 当然,你不能对替换模式进行文本操作,你需要能够访问匹配值以便对其进行操作。至今我还没有听说在Swift中可以将“匿名函数”作为正则表达式替换方法的替换参数的方法。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接