2017-01-18 4 views
0

これまでかなりの数の正規表現のスタックオーバーフローの質問を見てきましたが、私の正規表現が私がしたい部分文字列をフィルタリングしない理由除去する。私は迅速に知っている、私は私が持っている他のエスケープをエスケープする必要があります。Swift 3でパイプ区切り記号付きの正規表現を使用して一致をフィルタリングします。

まず、私はそうのような文字列に拡張子を持っている:

+++cta\n[![](http://media.test.com/1.jpg)](http://www.test.com/slideshow)\n\n+++\n\n<span class=\"s1\">Hello</span><span class=\"s2\"> World\n\n[cm_image id=\"13501068\"]<img style=\"width: 100%;\" src=\"http://www.test.com/1.jpg\" alt=\"\" />[/cm_image]\n\n[#c: /c/56be30deff2afb50ef000026]||||||

私はこれが私のスウィフトのプロジェクトでHello World\nを返したい、:

extension String { 
    func stringByRemovingRegexMatches(pattern: String, replaceWith: String = "") -> String? { 
     do { 
      let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive) 
      print(regex) 
      let range = NSMakeRange(0, self.characters.count) 
      return regex.stringByReplacingMatches(in: self, options: [], range: range, withTemplate: replaceWith) 
     } catch { 
      return nil 
     } 
    } 
} 

はのはテキストである例えばましょう<span>を除外しているように見えます。

+++cta\n[![](http://media.test.com/1.jpg)](http://www.test.com/slideshow)\n\n+++\n\nHello World\n\n[cm_image id=\"13501068\"]<img style=\"width: 100%;\" src=\"http://www.test.com/1.jpg\" alt=\"\" />[/cm_image]\n\n[#c: /c/56be30deff2afb50ef000026]||||||

スウィフトで私の正規表現文字列は次のとおりです。

"\\+(^)\\+|\\\\n\\[(.*)\\|\\|\\|\\|\\|\\||\\\\n\\[c(.*)\\\\n\\\\n|\\+(.*)\\+\\\\n\\\\n|<[^>]+>" 

私はregexのprint文を持っている上にあなたは私がregexrに入れているものと一致すると、文字列があるわかります:

<NSRegularExpression: 0x7ff8d576df00> \+(^)\+|\\n\[(.*)\|\|\|\|\|\||\\n\[c(.*)\\n\\n|\+(.*)\+\\n\\n|<[^>]+> 0x1 

\+(^)\+|\\n\[(.*)\|\|\|\|\|\||\\n\[c(.*)\\n\\n|\+(.*)\+\\n\\n|<[^>]+> 

どちらもまったく同じです。

さらに明確にするために、私はregexr hereへのリンクを持っています。

私はSwiftで間違ったことをしていますか?それは速いが(.*)を認識しないのですか?どんな助けでも大歓迎です。

+0

実際の文字列には改行文字が含まれていますが、正規表現が現在一致している '' \ '' + 'n'の組み合わせではありません。 –

+0

私は '' '' ''をエスケープして、startIndexおよび/またはendIndexとして使用することができると考えました – jasonnoahchoi

+0

正規表現を構築するときに従った規則はありません。それはあまりにも具体的で、1つの正確な文字列に一致するようです。 | | \ n \\ [cm。*" '](https://regex101.com/r/4uB1Kt/1)。 –

答えて

0

((.|\n)*)の間にstartIndexとendIndexがあることを確認して、境界間にすべての文字または戻り値が必要なので、この問題を解決しました。

+0

それをしないでください、それは非常に悪い考えです。 '(?s)'修飾子を使って改行をマッチさせます。 –

関連する問題