2017-06-14 7 views
1

あるテキストの中にある特定の行をマッチさせ、そのマッチの中で特定の文字を頻繁に置き換えたい。 サンプルテキスト:RegExのマッチの中の文字を置換する

任意のテキストと「多」「それ以上」です。ここでは引用符
CatchThis交換しないでください(ここでは引用符なしに、「これ以上のテキスト」、「などなど...」)
catchthat(「いくつかの他のテキスト」、「以下」)

CatchAnything「間」にあるいくつかのテキスト(「もっと」、「多く」、そこには引用符、「テキストの壁」)
より(「テキスト」「」 ")と引用符の後に。 ..

今、私はラウンドbracke内のすべての引用を置き換えたいtsは、ハッシュ記号と言うことができます。 希望の結果:

任意のテキストと「多」「それ以上」です。 (#andようになど...#、複数のテキスト##any、ここでは引用符なし)、ここで引用符
CatchThisを交換しないでください
catchthat(#some他のテキスト#、#or少ない#)

"間" CatchAnything(#evenより#、#andより#、そこに引用符なし、テキスト#の#wall)
より( "テキスト" "" ")と後の引用符で囲まれたいくつかのテキスト。 ..

これは私のパターンです:

(?i)Catch(?:This|That|Anything)[ \t]*\(.+\) 

は残念ながら、私は...すべての引用符が一致し、それを交換する方法が分からない

答えて

1

\G anchorベースの正規表現を使用して経由で2つの異なる区切り文字内のいくつかのパターンのすべての出現に一致する共通のアプローチ上の文字を置き換えることができます。

(?i)(?:\G(?!\A)|Catch(?:This|That|Anything)\s*\()[^()"]*\K" 

regex demoを参照してください。

説明

  • (?i) - 大文字小文字を区別しない修飾子
  • (?: - 2つの選択肢
    • \G(?!\A)に一致する非キャプチャグループ - 右前回成功した試合後の文字列内の場所(\Gも文字列の先頭に一致するため、その可能性を排除するために(?!\A)が必要です)
    • |
    • -
    • Catch(?:This|That|Anything)又は
    • から Catchいずれか This又は That又は
    • \s*Anythingと続く - 0+空白
    • \(から
  • )
  • リテラル(シンボル - 非の終わりキャプチャグループ
  • マッチリセットオペレータ
  • " - - 二重引用符0から()"
  • \K以外の任意の0+文字。だ
+1

とてもいいです!医者が注文したものだけ。完璧に働いて...説明のために大きなthx! – TheFriesel

+1

ちょうどあなたが*マルチ*文字区切り文字の間で複数のトークンを一致させる必要がある場合には、私が代わりに否定文字の[「焼き貪欲トークン」](https://stackoverflow.com/a/37343088/3832970)を使用して助言することができますクラス(ここでは、 '[^()"] * '使用されている)ヘッドの –

+0

おかげアップ、私はそれを見ていきますが、最初、私は完全にあなたのパターンを理解する必要があります;。!) – TheFriesel

0

本当にこの内部の正規表現を交換する必要がありますか?あなたの正規表現は、あなたが欲しいものを見つけた場合は、見つかった文字列

+0

、私が今やっている:、試合の配列を取得引用符を置き換え、変更を元のテキストに一致して注入します。それはかなり精巧で、私はマッチの中で直接交換する方がはるかにエレガントで多分もっと速いです... – TheFriesel

関連する問題