如何在空格上匹配正则表并在不覆盖空格的情况下进行替换

时间:2014-04-20 15:59:51

标签: c# regex

我有一个正则表达式匹配,如下面的代码:

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);

并且能够获得理想的结果。

1 个答案:

答案 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;
    }
}

这样您就不必重新添加空格。