web-dev-qa-db-ja.com

Swiftサブストリング正規表現を置換

正規表現を使用して、文字列内のすべての英国の自動車登録を置換しようとしています。

次のSwiftコードは、文字列が次のように正規表現に完全に一致する場合に完全に機能します。

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

誰も私にポインタを与えることができますか?

31
jjc99

^および$アンカーを削除する必要があります。

^文字列の開始を意味し、$文字列の終了(またはオプションに応じて行)を意味します。これが最初の例が機能する理由です。最初のテスト文字列では、文字列の先頭に実際にパターンが続き、それで終わります。

2番目のテスト文字列では、パターンは文字列の中央にあるため、^...は適用できません。 ^を削除するだけの場合、$は2回目の登録番号に適用され、出力は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"
41
DarkDust

クラス拡張を使用して、これを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(したがって、電話番号から国コードを削除します)

19
Ryan Brodie

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)
}
9
Daniel J

pattern: "^ ... $"を使用すると、パターンを文字列の先頭と末尾に固定するように指定しました。つまり、全体文字列がパターンに一致する必要があります。パターンから^$を削除するだけで、期待どおりの結果が得られます。

4
Martin R

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)
}
2
black_pearl