我有一个正则表达式匹配,如下面的代码:
string[] specials = new string[] { "special1", "special2", "special3" };
for (int i = 0; i < specials.Length; i++)
{
string match = string.Format("(?:\\s)({0})(?:\\s)", specials[i]);
if (Regex.IsMatch(name, match, RegexOptions.IgnoreCase))
{
name = Regex.Replace(name, match, specials[i], RegexOptions.IgnoreCase);
break;
}
}
我想要的是让替换操作只替换匹配的文本并保留前导和尾随空格。所以“这是一个特别的1句话”将成为“这是一个特殊的句子”。使用上面的替换语句,我得到“这是aspecial1sentence”。
解决方案:
基于@Jerry的评论,我将比赛更改为:
(\\s)({0})(\\s)
和替换为:
name = Regex.Replace(name, match, "$1" + specials[i] + "$3", RegexOptions.IgnoreCase);
并且能够获得理想的结果。
答案 0 :(得分:2)
您可以使用lookbehind和lookahead检查空格,而不在匹配中包含它们:
string[] specials = new string[] { "special1", "special2", "special3" };
for (int i = 0; i < specials.Length; i++)
{
string match = string.Format("(?<=\\s){0}(?=\\s)", specials[i]);
if (Regex.IsMatch(name, match, RegexOptions.IgnoreCase))
{
name = Regex.Replace(name, match, specials[i], RegexOptions.IgnoreCase);
break;
}
}
这样您就不必重新添加空格。