2016-12-23 13 views
0

私のregExpが正しい結果を得られないため、どこに間違いがあるかわかりません。RegExpの結果が期待通りではない

let ori_str = "abcXabcYabcZ" // there are 3 Capital character 

    let pattern = "[A-Z]" 

    let regular = try!NSRegularExpression(pattern: pattern, options: .caseInsensitive) 

    let results = regular.matches(in: ori_str, options: .reportProgress , range: NSMakeRange(0, ori_str.characters.count)) 
    print("results have: \(results.count) count") // log 'result have: 12 count' why 12 without 3 ??? 

は、私はその後、資本文字を取得-(the Capital character's lower character)-にそれらを交換したいのですが、私の正規表現の結果は、資本の文字のコンソール12カウントです。

1)表示されていますが、間違いはどこですか3。
2)大文字を-(the capital's lower character)-に置き換える方法は?


追加-1

は以下NSRegularExpression.Optionsのすべてがあります。

public static var caseInsensitive: NSRegularExpression.Options { get } 

    public static var allowCommentsAndWhitespace: NSRegularExpression.Options { get } 

    public static var ignoreMetacharacters: NSRegularExpression.Options { get } 

    public static var dotMatchesLineSeparators: NSRegularExpression.Options { get } 

    public static var anchorsMatchLines: NSRegularExpression.Options { get } 

    public static var useUnixLineSeparators: NSRegularExpression.Options { get } 

    public static var useUnicodeWordBoundaries: NSRegularExpression.Options { get }` 
+1

'.caseInsensitive'? – Tushar

+0

@タシャールは間違っていますか?それを置き換える方法? – aircraft

+1

大文字と小文字を区別する必要があります。 'options:.caseInsensitive'とすると、大文字と小文字を区別しません。私の前提が正しい場合、それを削除してみることができますか?デフォルトでは大文字と小文字が区別されます。 – Tushar

答えて

1

あなたは大文字と小文字を区別試合を行う必要があります。 オプションを.caseInsensitiveから[]に変更します。

NSRegularExpression.Optionsは、0個以上の値を指定できるOptionSetです。ゼロを渡すとき、またはそれ以上のときは、配列のリテラル構文が使用されます。 参照:それをカバーする正規表現のグループを使用して、第二の基準についてhttps://developer.apple.com/reference/swift/optionset

let ori_str = "abcXabcYabcZ" // there are 3 Capital character 
let pattern = "[A-Z]" 
let regular = try!NSRegularExpression(pattern: pattern, options: []) 
let results = regular.matches(in: ori_str, options: .reportProgress, range: NSMakeRange(0, ori_str.characters.count)) 
print("results have: \(results.count) count") 

、:

extension String { 
    func replace(regex: NSRegularExpression, with replacer: (_ match:String)->String) -> String { 
     let str = self as NSString 
     let ret = str.mutableCopy() as! NSMutableString 

     let matches = regex.matches(in: str as String, options: [], range: NSMakeRange(0, str.length)) 
     for match in matches.reversed() { 
      let original = str.substring(with: match.range) 
      let replacement = replacer(original) 
      ret.replaceCharacters(in: match.range, with: replacement) 
     } 
     return ret as String 
    } 
} 

let ori_str = "abcXabcYabcZ" // there are 3 Capital character 
let pattern = "[A-Z]" 
let regular = try!NSRegularExpression(pattern: pattern) 
let replaced = ori_str.replace(regex: regular) { "-\($0.lowercased())-" } 
print("Uppercase characters replaced: \(replaced)") 
:あなたは、各試合のために、追加のカスタムコードを必要とする、より高度なものについては、

let ori_str = "abcXabcYabcZ" // there are 3 Capital character 
let pattern = "([A-Z])" 
let regular = try!NSRegularExpression(pattern: pattern) 
let replaced = regular.stringByReplacingMatches(
    in: ori_str, options: [], 
    range: NSMakeRange(0, ori_str.characters.count), 
    withTemplate: "-$1-").lowercased() 
print("Uppercase characters replaced: \(replaced)") 

+3

'options:[]'はデフォルトですので、 'let regular = try!'と書くことができます。 NSRegularExpression(パターン:パターン) ' – OOPer

+0

@kkoltzau、私の質問はキャプション文字を置き換える、あなたはそれを完了することができますので、これは完全な答えです。 – aircraft

+0

@kkoltzau、良い答え、非常に良い。 – aircraft

関連する問題