0

したがって、文字列は次のとおりです。「DC:PPE Env:CH1 Slice:whatever to extract」または「babaasdfsd DC:PPE asdfas Env:CH1 or Slice:whatever」

基本的に、「DC:PPE」「Env:CH1」「Slice:whatever」を見つけて削除しようとしています。

次の正規表現を使用しています:(c#)

Regex r = new Regex(
    @"(?:
    (?<captured>(?:^|\s+)Slice|Env|Dc:.*?\s+)()
  ){1}
  \1",

(?:^|\s+)私はSlice | Env | Dcが最初に表示されるか、先頭にスペースがあるかのいずれかに一致させようとしています。.*?\s+DC:PPE の後のスペースを非貪欲に一致させようとしています。

3 つのマッチすべてをまとめて返したいと思います。これの何が問題なのですか?

string combinedTestSTring = "DC:PPE Env:CH1 Slice:whatever  to extract";

Regex r = new Regex(
    @"(?:
    (?<captured>(?:^|\s+)Slice|Env|Dc:.*?\s+)()
  ){1}
  \1",

RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase);


var a = r.Matches(combinedTestSTring);
4

1 に答える 1

0

これはあなたが望むことをしますか:

Regex r = new Regex(@"\b(:?Slice|Env|Dc):.+?)\b");

\b単語境界に一致します。次に、別の単語境界につながる少なくとも 1 つの文字Slice|Env|Dcが続きます。:

すべての一致をまとめて返すことはできません。一致の配列を返す場合、各要素は正規表現の異なるキャプチャ グループに対応します。繰り返し回数またはワイルドカードを含むグループがある場合、返される一致は最後に見つかったものであり、すべてではありません。そのため、入力文字列をウォークスルーして各一致を返すループを作成する必要があります。

ただし、それらをすべて置き換えたい場合r.Replace()は、文字列内のすべての一致を置き換えるため、それを行います。

于 2012-09-14T04:59:10.997 に答える