2016-05-09 7 views
0

私がある文字列があります。以下のパターンで正規表現パターンの周りに単語を取り込む方法は?

let s : String = "The dog ate the cat." 

let p : NSRegularExpression = try! NSRegularExpression(pattern: "\\w()?dog()?\\w"), options: .CaseInsensitive) 

を私の質問は:私は、パターンの発生前と発生後の単語を取得するにはどうすればよいですか?

これは私の現在の実装である:

let t : [NSTextCheckingResults] = p.matchesInString(s, options: [], NSMakeRange(0, NSString(string: s).length)) 
print(String(t[0].URL!)) 

は、しかし、これは望ましい結果を返しません。

正規表現に問題がありますか?

+0

あなたのパターンは、現在は、電子犬それはあなたが本当に欲しいものA'ある 'なっていますか?それを見てください:https://regex101.com/r/zM6aF2/1 –

+0

それはありません。それは以前よりも多くの情報ですが。私が印刷するときのすべてのXcodeショーは: "\\ w()?dog()?\\ w" –

+0

まあ、私はiosの開発者ではありません。私は正規表現についてのみ知識を共有していました。 objCがscapingする必要があるかどうかわからない。正規表現では、あなたがあなたの質問で尋ねるものを得るために必要なパターンは '(。+)\ bdog \ b(。+)'になります。この正規表現を参照してください:https://regex101.com/r/zM6aF2/2 –

答えて

1

はこれを試してみてください:

extension String { 
    subscript (range: NSRange) -> String { 
     let startIndex = self.startIndex.advancedBy(range.location) 
     let endIndex = startIndex.advancedBy(range.length) 

     return self[startIndex..<endIndex] 
    } 
} 

let s = "The dog ate the cat." 

let pattern = try! NSRegularExpression(pattern: "(\\w+)?\\s?dog\\s?(\\w+)?", options: [.CaseInsensitive]) 

let matches = pattern.matchesInString(s, options: [], range: NSMakeRange(0, s.characters.count)) 

for m in matches { 
    print(s[m.rangeAtIndex(0)]) 

    let range1 = m.rangeAtIndex(1) 
    if range1.location != NSNotFound { 
     print("capture group 1:", s[range1]) 
    } 

    let range2 = m.rangeAtIndex(2) 
    if range2.location != NSNotFound { 
     print("capture group 2:", s[range2]) 
    } 
} 

Stringへの拡張はオプションですが、それははるかに簡単NSRangeでの作業になります。 2つのキャプチャグループは(\\w+)?で、オプション作られたので、それはあまりにも以下の文字列に一致します。

// The dog ate the cat 
The dog ate 
capture group 1: the 
capture group 2: ate 

// dog ate my home work 
dog ate 
capture group 2: ate 

// I love my dog 
my dog 
capture group 1: my 

// dog 
dog 
+0

正規表現は機能します(huzzah!)NSTextCheckingResultにはURLプロパティはないようですが。なぜこれに当てはまるのでしょうか? –

+0

Checkout ['NSDataDetector'](https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSDataDetector_Class/#//apple_ref/occ/instp/NSDataDetector/checkingTypes)、' NSRegularExpression'のサブクラスです。 。 'NSDataDetector'は基本的にアップルが提供する正規表現で、いくつかの一般的なデータ(URL、住所、カレンダーの日付など)を検出するのに役立ちます。とにかく、サンプル文字列内にキャプチャするURLはありません。 –

関連する問題