2009-09-15 256 views
0

我嘗試使用.NET正則表達式替換字符串 元素 - 沒有運氣:)正則表達式替換字符串

假設以下字符串:

 AA A  C D   A Some Text   here

規則

  1. 在行
  2. 的開始,不要更換隻做取代單出現
  3. 如果空間之前或之後並沒有取代它(可選)

從上述期望的結果是(#作爲替換字符):

 AA#A  C#D   A#Some Text   here

回答

2

這應包括您的要求的所有3。請原諒格式化;我必須重新選擇 的前幾行才能正確顯示。

string pattern = @"(?<!^|&nbsp;)((?<!\s)&nbsp;(?!\s))(?!\1)";

string[] inputs = { "&nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A&nbsp;Some Text &nbsp; here", // original

"&nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here" // space before/after

};

foreach (string input in inputs) 
{ 
    string result = Regex.Replace(input, pattern, "#"); 
    Console.WriteLine("Original: {0}\nResult: {1}", input, result); 
} 

輸出:

Original: &nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A&nbsp;Some Text &nbsp; here

Result: &nbsp;AA#A&nbsp;&nbsp;C#D&nbsp;&nbsp; A#Some Text &nbsp; here

Original: &nbsp;AA&nbsp;A&nbsp;&nbsp;C&nbsp;D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here

Result: &nbsp;AA#A&nbsp;&nbsp;C#D&nbsp;&nbsp; A &nbsp;Some Text &nbsp; here

+0

非常感謝。下次我會簡單地給你發送我的消息來修復:) 優秀的例子!!! – ManniAT 2009-09-15 11:04:12

1

我不熟悉C#的特定的正則表達式的味道,但在Perl/PHP樣式這個工作對我來說:

s/(?<!\A| |&nbsp;)&nbsp;(?!&nbsp;|)/#/g

該R負面lookbehead,負面看法和\ A =輸入轉義序列的開始。

+0

會(有一些修改)工作 - 謝謝。 我選擇Ahmads答案,因爲它解決了整個問題。 – ManniAT 2009-09-15 11:03:25

1

你應該試試下面的例子:

string s = Regex.Replace(original, "(?<!(&nbsp;| |^))&nbsp;(?!(&nbsp;|))", "#");

+0

是的,我有同樣的問題...使用後面打勾不是4空間縮進。 – beggs 2009-09-15 10:37:49

+0

@beggs:謝謝,只是想弄清楚。將編輯。 – LukeH 2009-09-15 10:38:30

+0

您可以進一步縮短爲'(?<!  | | ^) (?!  |)' – 2009-09-15 10:55:54

0

你可以使用這個

[^^\s(nbsp;)](nbsp;)[^$\s(nbsp;)]