Подтвердить что ты не робот

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

Может ли кто-нибудь дать мне какие-нибудь указания?

4b9b3361

Ответ 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}}