如何替换 Swift 中第一个出现的正则表达式?

问题描述 投票:0回答:2

如何将 ReplaceOccurrences 与正则表达式一起使用并且仅替换第一次出现的情况?

示例

var str = "= 1 = 2 = 3"
str = str.replacingOccurrences(of: "(\\d+)", with: "\\\\$1", options: .regularExpression)
// prints: = \\1 = \\2 = \\3
// should print: = \\1 = 2 = 3
swift regex replace
2个回答
7
投票

String.range()
将在第一场比赛时停止:

var str = "= 1 = 2 = 3"
if let range = str.range(of: "\\d+", options: .regularExpression) {
    let substr = str[range]
    str = str.replacingCharacters(in: range, with: "\\\\" + substr)
}

print(str)

0
投票

您实际上可以使用一种常见的解决方法,并稍微修改一下正则表达式(@I'L'I已经建议了这个想法,但我建议对其进行一些修改):

var str = "= 1 = 2 = 3"
str = str.replacingOccurrences(of: "(?s)([0-9]+)(.*)", with: "\\\\\\\\$1$2", options: .regularExpression)
print(str) // => = \\1 = 2 = 3

两点备注:

  • (?s)([0-9]+)(.*)
    - 匹配前 1 个或多个数字(第 1 组),然后捕获字符串的所有其余部分(请注意,由于
    .
    内联“dotall”修饰符,
    (?s)
    将匹配换行符)
  • 替换部分需要 4 个反斜杠来替换为 1 个反斜杠,因此,您需要在那里放置 8 个反斜杠才能在输出中获得 2 个文字反斜杠。

类似于@CodeDifferent解决方案,使用字符串变异

.replaceSubrange
方法提到的@MartinR:

var str = "= 123 = 256 = 378"
if let range = str.range(of: "[0-9]+", options: .regularExpression) {
    str.replaceSubrange(range, with: "\\\\" + str[range])
}
print(str) // => = \\123 = 256 = 378

关于正则表达式的提示:

  • 要匹配独立数字(不是
    ABC1234
    中的数字),请使用单词边界 (
    "\\b[0-9]+\\b"
    ) 或否定环视(即“(?
  • 由于 ICU 正则表达式默认支持 Unicode,因此您应该考虑使用
    [0-9]
    而不是
    \d
    以避免匹配非 ASCII 数字。
© www.soinside.com 2019 - 2024. All rights reserved.