2016-11-21 250 views
5

我有一句话,“姓名#2”,字符串正则表达式替换

我需要更换“#”,以“号”,

最后一句需要“名称编号2" 。

码 -

string sentence = Regex.Replace("Name # 2", "\\#\\b", "No."); 

显然,Regex.Replace无法取代“#”与“否”,有没有解决这个问题的正确道路,通过正则表达式。 感谢 我要寻找一个正则表达式的原因是因为它执行的通用代码,它看起来像下面

 string pattern = string.Format(@"\b{0}\b", context); 

    sentence = System.Text.RegularExpressions.Regex.Replace(sentence, pattern, suggestion); 

语境 - “#”

一句话 - “姓名#2”

建议 - “否”

预期的一句话 - “名称2号”

实际一句话 - “姓名#2”

语境 - “是”

一句话 - “他打算”

建议 - “是”

预期的一句话 - “他要”

实际句话 - “他要”

语境 - “一”

一句话 - “他是在一个时间点去。”

建议 - “Z”

预期的一句话 - “他在一次ž点去”

+3

OMG!为什么是正则表达式? –

+0

@ThomasWeller我编辑了我的问题。 – Sandepku

+0

'\ b'匹配单词边界(字母数字和其他)。在你的输入中'#'旁边没有这样的边界。 –

回答

6

如果#前面带有一个当前的正则表达式不匹配word char,一个字母,数字或下划线。发生这种情况是因为字边界的含义与上下文相关。

与任何下面的修复程序替换:

string pattern = string.Format(@"(?<!\w){0}(?!\w)", Regex.Escape(context)); 
           ^^^^^^ ^^^^^^ 

(?<!\w)(?!\w)是上下文无关的,并且如果不是前面/随后与字字符将匹配的词。

或者,使用

string pattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(context)); 

只匹配内部空格(S)为(?<!\S)负回顾后一个字需要的空格或字符串的“字”之前启动,而负先行(?!\S)要求“单词”后的字符串结尾或空白字符。

请注意,Regex.Escape是处理用户输入/动态模式构建时必须的,并且需要在正则表达式模式中使用字符串字符串。它会逃脱所有特殊字符(如?,+等),否则可能会破坏图案。 OMG!

4
string test = "Name # 2"; 

test = test.Replace("#", "No."); 
+0

对不起,我需要通过正则表达式, – Sandepku

+0

test = Regex.Replace(test,“#”,“No.”); – mybirthname

+0

@Sandepku你应该解释(编辑你的文章)为什么你*需要*使用正则表达式。 –

3

你可以试试:

string sentence = Regex.Replace("Name # 2", "#", "No."); 

#不必逃脱,因此不需要反斜杠。

+0

我可以尝试很多。你为什么认为它有效? –

2

使用正则表达式,你可以做到这一点,像这样:

Regex.Replace("Name # 2", "#", "No.") 

或者只是一个普通的老与string.replace:

"Name # 2".Replace("#", "No.");