Swift заменить подстроку regex
Я пытаюсь использовать регулярное выражение для замены всех вхождений регистрации автомобилей в Великобритании внутри строки.
Следующий быстрый код отлично работает для a, когда строка соответствует регулярному выражению точно так, как показано ниже.
var myString = "DD11 AAA"
var stringlength = countElements(myString)
var ierror: NSError?
var regex:NSRegularExpression = NSRegularExpression(pattern: "^([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}$", options: NSRegularExpressionOptions.CaseInsensitive, error: &ierror)!
var modString = regex.stringByReplacingMatchesInString(myString, options: nil, range: NSMakeRange(0, stringlength), withTemplate: "XX")
print(modString)
Результат XX
Однако следующее не работает, и строка не модифицирована
var myString = "my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB"
var stringlength = countElements(myString)
var ierror: NSError?
var regex:NSRegularExpression = NSRegularExpression(pattern: "^([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}$", options: NSRegularExpressionOptions.CaseInsensitive, error: &ierror)!
var modString = regex.stringByReplacingMatchesInString(myString, options: nil, range: NSMakeRange(0, stringlength), withTemplate: "XX")
print(modString)
Результат my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB
Может ли кто-нибудь дать мне какие-нибудь указания?
Ответы
Ответ 1
Вам нужно удалить якоря ^
и $
.
^
Означает начало строки, а $
означает конец строки (или строку, в зависимости от параметров). Вот почему ваш первый пример работает: в первой тестовой строке за началом строки действительно следует ваш шаблон и заканчивается он.
Во второй тестовой строке шаблон находится в середине строки, поэтому ^...
не может быть применен. Если вы просто удалите ^
, $
будет применяться при втором появлении регистрационного номера, и на выходе будет my car reg 1 - DD11 AAA my car reg 2 - XX
.
let myString = "my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB"
let regex = try! NSRegularExpression(pattern: "([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}", options: NSRegularExpression.Options.caseInsensitive)
let range = NSMakeRange(0, myString.count)
let modString = regex.stringByReplacingMatches(in: myString, options: [], range: range, withTemplate: "XX")
print(modString)
// Output: "my car reg 1 - XX my car reg 2 - XX"
Ответ 2
Позвольте использовать расширение класса, чтобы обернуть это в синтаксисе Swift 3:
extension String {
mutating func removingRegexMatches(pattern: String, replaceWith: String = "") {
do {
let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive)
let range = NSMakeRange(0, self.count)
self = regex.stringByReplacingMatches(in: self, options: [], range: range, withTemplate: replaceWith)
} catch {
return
}
}
}
var phoneNumber = "+1 07777777777"
phoneNumber.removingRegexMatches(pattern: "\\+\\d{1,4} (0)?")
Результаты в 7777777777
(таким образом, удаленный код страны с номера телефона)
Ответ 3
Обновление для Swift 2.1:
var myString = "my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB"
if let regex = try? NSRegularExpression(pattern: "([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}", options: .CaseInsensitive) {
let modString = regex.stringByReplacingMatchesInString(myString, options: .WithTransparentBounds, range: NSMakeRange(0, myString.characters.count), withTemplate: "XX")
print(modString)
}
Ответ 4
С pattern: "^ ... $"
вы указали, что шаблон привязан
к началу и концу строки, другими словами, вся строка
должен соответствовать шаблону. Просто удалите ^
и $
из шаблона
и вы получите ожидаемый результат.
Ответ 5
Swift 4.2 Обновлено
let myString = "my car reg 1 - DD11 AAA my car reg 2 - AA22 BBB"
if let regex = try? NSRegularExpression(pattern: "([A-HK-PRSVWY][A-HJ-PR-Y])\\s?([0][2-9]|[1-9][0-9])\\s?[A-HJ-PR-Z]{3}", options: .caseInsensitive) {
let modString = regex.stringByReplacingMatches(in: myString, options: [], range: NSRange(location: 0, length: myString.count), withTemplate: "XX")
print(modString)
}
Ответ 6
Предупреждение
Не используйте NSRange(location: 0, length: myString.count)
, как все приведенные выше примеры.
Вместо этого используйте NSRange(myString.startIndex..., in: myString)
!
.count
будет считать символы новой строки, такие как \r\n
, как один символ - это может привести к сокращенному, поэтому недействительному, NSRange, который не соответствует всей строке.
(длина должна работать)
Ответ 7
swift3 12345678 до 1234 5678
extension String {
func codeFormat() -> String {
let newStr = NSMutableString()
for i in 0..<self.length {
if (i > 0 && i % 4 == 0){
newStr.append(" ")}
var c = self.NS.character(at: i)
newStr.append(NSString(characters: &c, length: 1) as String)
}
return newStr as String}}