如何将 ReplaceOccurrences 与正则表达式一起使用并且仅替换第一次出现的情况?
示例
var str = "= 1 = 2 = 3"
str = str.replacingOccurrences(of: "(\\d+)", with: "\\\\$1", options: .regularExpression)
// prints: = \\1 = \\2 = \\3
// should print: = \\1 = 2 = 3
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)
您实际上可以使用一种常见的解决方法,并稍微修改一下正则表达式(@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)
将匹配换行符)类似于@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"
) 或否定环视(即“(?
[0-9]
而不是 \d
以避免匹配非 ASCII 数字。