2009-09-15 215 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;)]