文字列の配列を使用していて、次のことを実行したいと思います。
//Regex regex; List<string> strList; List<string> strList2;
foreach (string str in strList){
if (regex.IsMatch(str)) { //only need in new array if matches...
strList2.Add(regex.Replace(str, myMatchEvaluator))
//but still have to apply transformation
}
}
今、私はそれが機能することを知っていますが、それは事実上、配列内の各文字列で同じ正規表現を2回実行することを意味します。これらのステップ(フィルタリングと変換)の両方を1つの正規表現解析呼び出しに折りたたむ方法はありますか?
(ほとんどの場合に機能するのは
string str2 = regex.Replace(str, myMatchEvaluator);
if (str2 == str)
strList2.Add(str2);
しかし、それでも交換の必要がないいくつかの有効な一致がスローされることがよくあります。)
編集:これがトリッキーである理由を説明するための、私のものとほぼ同じ正規表現の例:ログファイルの行の先頭にある単語を探し、それらを大文字にしたい場合を想像してみてください。
正規表現はnew Regex("^[a-z]+", RegexOptions.IgnorePatternWhiteSpace)
、になり、置換関数はになりますmatch => match.ToUpper()
。
現在、いくつかの最初の単語はすでに大文字になっているので、それらを捨てたくありません。一方、行の単語のすべてのインスタンスを大文字にするのではなく、最初のインスタンスだけを大文字にします。