C# 如何在不覆盖空格的情况下对空格进行正则表达式匹配和替换

C# 如何在不覆盖空格的情况下对空格进行正则表达式匹配和替换,c#,regex,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, 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;
    }
}
string[]specials=新字符串[]{“special1”、“special2”、“special3”};
对于(int i=0;i
我想要的是让replace操作只替换匹配的文本,并保留前导和尾随空间。所以“这是一个特殊的句子”会变成“这是一个特殊的句子”。通过上面的Replace语句,我得到“这是Aspecial1事件”

解决方案:

根据@Jerry的评论,我将匹配更改为:

(\\s)({0})(\\s)

替换为:

name=Regex.Replace(名称,匹配,“$1”+特殊[i]+“$3”,RegexOptions.IgnoreCase)


并且能够获得所需的结果。

您可以使用“向后看”和“向前看”来检查空格,而不必将其包含在匹配中:

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;
    }
}
string[]specials=新字符串[]{“special1”、“special2”、“special3”};
对于(int i=0;istring match=string.Format(“(?最简单的方法是将它们添加回replace…
Regex.replace(name,match,“+specials[i]+”,RegexOptions.IgnoreCase)中);
假设您只使用了
\\s
匹配空格。@Jerry-我应该提到它,但这正是我目前正在做的。我还有另一个例子,匹配将是
(?:^\s)
因此空间填充并不总是适用的。好吧,那么下一个最简单的方法就是将那些带有捕获组的空间放回原位。实际上,您可以将正则表达式更改为
@(^ |\s){0}(\s |$)”
然后替换为
regex.replace(名称,匹配,$1+specials[i]+“$2”,RegexOptions.IgnoreCase)
$1
将包含第二个匹配的
(^ |\s)
$2
。不过,如果您想让它更简单,请使用
\b
而不是
(^ |\s)
(\s |$)
而且你不必在后面加空格。这是假设在
specials
中只有字母数字字符串。“special”这个词会出现在行首或行尾而没有尾随空格吗?@ClickRick-在这种情况下不会。