【问题标题】:Replacing a string with a capture group in Swift 3在 Swift 3 中用捕获组替换字符串
【发布时间】:2017-09-10 20:46:31
【问题描述】:

我有以下字符串:“@[1484987415095898:274:Page Four]”并且我想捕获名称,所以我写信给以下正则表达式 @\[[\d]+:[\d]+:(.*)] 它似乎正在工作,但现在我正在努力理解如何用捕获组替换前一个字符串。

“Lorem ipsum @[1484987415095898:274:第四页] dolores”->
"Lorem ipsum Page 4 dolores"

注意,我看到了如何使用this stack question 取出捕获组 但是,如何找到从中提取的原始字符串并替换它?

【问题讨论】:

标签: regex swift


【解决方案1】:

您需要将整个匹配替换为 $1 替换反向引用,该反向引用包含第一个捕获组捕获的内容。

此外,如果您决定稍后扩展该模式,我建议将 [\d] 写为 \d 以避免对字符类联合的误解。此外,使用.*?(惰性点匹配)来获取第一个] 而不是最后一个] 更安全(如果您使用.* 贪婪变化)。但是,这取决于实际需求。

使用以下任意一种:

let txt = "Lorem ipsum @[1484987415095898:274:Page Four] dolores"
let regex = NSRegularExpression(pattern: "@\\[\\d+:\\d+:(.*?)\\]", options:nil, error: nil)
let newString = regex!.stringByReplacingMatchesInString(txt, options: nil, range: NSMakeRange(0, count(txt)), withTemplate: "$1")
print(newString)
// => Lorem ipsum Page Four dolores

let txt = "Lorem ipsum @[1484987415095898:274:Page Four] dolores"
let newString = txt.replacingOccurrences(of: "@\\[\\d+:\\d+:(.*?)]", with: "$1", options: .regularExpression)
print(newString)
// => Lorem ipsum Page Four dolores

【讨论】:

  • 或者干脆let newString = txt.replacingOccurrences(of: "@\\[[\\d]+:[\\d]+:(.*)]", with: "$1", options: .regularExpression)
  • @rmaddy 是的,这是一个更好的符号,谢谢。我仍然更喜欢我的模式,它更干净,应该更安全,以防同一行上有多个匹配项。
  • 如果您更喜欢使用NSRegularExpression(它有很多好处),那么为什么要更改您的答案呢?
  • @rmaddy 我以为你批评了我的记法 :)
  • 一点也不。我只是指出了另一种方法。您使用NSRegularExpression 有它的好处。如果是一次性使用,我的建议很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多