2017-03-16 15 views
1

タイトルがあまりにも混乱しないことを願っています。私の仕事はXのすべてをYZの間で一致させて置き換えることです。'Y'から 'Z'まで 'X'をすべて一致させてください。

私はX,Y,Zを使用しています。これらの値は実行時に異なる可能性がありますが、それはまったく問題ではありません。実際に..しかし、一つだけXのために働く

pattern = ".*Y.*?(X).*?Z.*"; 

:私がこれまで試したどのような

はこれです。私は単にそれらの "タグ"の間にすべてXをマッチさせる方法を理解することはできません。 "タグ" を無視して、

pattern = @"((Y|\G).*?)(?!Z)(X)" 

しかし、これはすべてのX秒に一致します。

私もこれを試してみました。

私の問題を解決する正しいパターンは何ですか?事前に感謝:)

編集

いくつかのより多くの情報:

Some.text.with.dots [nodots]remove.dots.here[/nodots] again.with.dots 

Xは、単一charYZは、より現実のテスト文字列strings

あるさ

=>一致する.秒EEN [nodots][/nodots]

(注:私はここでは、XMLのような構文を使用しますが、それは私が残念ながらシンプルなXMLまたはHTMLパーサーを使用することはできません保証されていない)あなたが交換する必要がある場合は、C#では

+2

私はより現実的なサンプル文字列を提供する必要があるのではないかと恐れています。 –

+0

明らかに '?(X *)'を試してみましたか...「X」は文字列を意味していますか? –

+0

[このデモ](http://regexstorm.net/Tester?p=%28%3f%3a%5cG%28%3f!%5e%29%7cy%28%3f%3d%5b%5ez%5d * z%29%29%5b%5ezx%5d *%28x%29&i = + gh + y + hh + x + x + x + z)。すべての 'x 'はグループ1に属しています。または[this one](http://regexstorm.net/Tester?p=y%28%3f%3a%5b%5ezx%5d*%28x%29%29*% 5b%5ez%5d * z&i = + gh + y + hh + x + x + x + z)。 –

答えて

2

いくつかのテキストブロックの中のあるテキストは、ブロックを(?s)(START)(.*?)(END)のような単純な正規表現とマッチさせてから、マッチエバリュエーターの中でマッチしたブロックに必要な置換えを行います。あなたのケースでは

、あなたはC# online demo

パターンが詳細をすべて見る

var res = Regex.Replace(str, @"(?s)(\[nodots])(.*?)(\[/nodots])", 
    m => string.Format(
     "{0}{1}{2}", 
      m.Groups[1].Value,     // Restoring start delimiter 
      m.Groups[2].Value.Replace(".",""), // Modifying inner contents 
      m.Groups[3].Value     // Restoring end delimiter 
     ) 
    ); 

のようなものを使用することができます:

  • (?s) - RegexOptions.Singleline修飾フラグのインラインバージョン
  • (\[nodots]) - グループ1:区切り文字を開始(文字列リテラル[nodots]
  • (.*?) - グループ2:できるだけ少ない任意の0+文字
  • (\[/nodots]) - グループ3:終了デリミタ(文字列リテラル[/nodots]
関連する問題