1

グローバル設定をオフにしたい (デフォルトで .NET で使用されるように設定されているため) 私がしようとしているのは文字列の最初の部分のみを変更する必要があるためですが、それが 2 回発生する可能性があります。たとえば、私は

C00000WPF0000SAND

0 の最初のインスタンスのみを変更します。

if (Regex.IsMatch(text, "^[a-z]+00+", RegexOptions.IgnoreCase))
{
    text = Regex.Replace(text, "0{1,}", "00*", RegexOptions.IgnoreCase);
}

これは私が現在行っている方法ですが、これは「00+」のすべてのインスタンスを取得して変更するようですが、これは混乱を招きます。

4

3 に答える 3

4

一致制限を指定する必要があります。のドキュメントにRegex.Replace(string, string, RegexOptions)は、見つかったパターンのすべてのインスタンスを置き換えると具体的に記載されています。Regex.Replace一致制限と正規表現オプションの両方を取るの静的オーバーロードはないため、Regex オブジェクトを作成してからReplace(string, string, int)オーバーロードを使用する必要があります。これを試して:

text = new Regex("0{1,}", RegexOptions.IgnoreCase).Replace(text, "00*", 1);
于 2012-06-11T12:53:19.653 に答える
2

正規表現をわずかに変更して、意図したパターンと一致し、最初のゼロのセットのみを置き換えることができます。それはまた、電話を切るのにも役立ちIsMatchます.

使用できるパターンは次のとおりです。(?<=^[a-z]+)00+

このパターンは最初のパターンと似ていますが、後読みを使用して(?<=^[a-z]+)、文字列の先頭で意図したとおりに一致するようにする点が異なります。後読みの使用は一致しますが、消費はしないため、置換は文字列のその部分に影響しません。

string text = "C00000WPF0000SAND";
text = Regex.Replace(text, "(?<=^[a-z]+)00+", "00*", RegexOptions.IgnoreCase);
Console.WriteLine(text);
于 2012-06-11T12:58:04.270 に答える
0

別の解決策は次のとおりです。

text = Regex.Replace(text, "(?i)^([a-z]+)00+", "${1}00*");

その場合、あなたはまったく必要ありませんif

于 2012-06-11T13:10:03.190 に答える