2012-06-11 61 views
1

我想關閉全局設置(因爲它設置默認爲在.NET上使用),因爲我想要做的只是需要更改字符串的第一部分,但是有的機會,這將在字符串中出現兩次,比如我想爲禁用正則表達式的全球

C00000WPF0000SAND

只改變0的第一個實例。

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

這是我現在怎麼做,但是這似乎採取了「00+」的每一個實例,並改變它,但這個食堂的事情了。

回答

3

您需要指定匹配限制; Regex.Replace(string, string, RegexOptions)的文檔明確指出它會替換找到的模式的所有實例。 Regex.Replace沒有靜態過載,它同時帶有匹配限制和正則表達式選項,因此您必須構造一個正則表達式對象,然後使用Replace(string, string, int)過載。試試這個:

text = new Regex("0{1,}", RegexOptions.IgnoreCase).Replace(text, "00*", 1); 
+0

+1,該死的揍我,下次更快! :) – KazR

+0

非常感謝,我會盡我所能接受這個答案。 –

2

你可以稍微改變你的正則表達式,使它匹配想要的模式,只替換第一組零。這也有助於減少IsMatch電話。

您可以使用該模式爲:(?<=^[a-z]+)00+

這種模式類似於你的第一個,但它採用的是向後看,(?<=^[a-z]+),以確保按預期在字符串的開頭髮生在比賽字母。後臺使用將匹配但不會消耗,所以替換不會影響該部分字符串。

string text = "C00000WPF0000SAND"; 
text = Regex.Replace(text, "(?<=^[a-z]+)00+", "00*", RegexOptions.IgnoreCase); 
Console.WriteLine(text); 
0

另一種解決方案是:

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

在這種情況下你不需要if可言。