字符串中的某些部分更改,但没有一部分 - 数字在哪里

时间:2014-02-06 08:29:48

标签: c# string replace

例如我有这样的字符串:

ex250-r-ninja-08-10r_

我怎么能把它改成这样的字符串?

ex250 r ninja 08-10r_

你可以看到我改变所有 - 空间,但没有改变它我XX-XX部分...我怎么能在c#中进行这样的字符串替换? (也可以是不同长度的字符串)

我是这样做的 -

string correctString = errString.Replace("-", " ");

但如何离开 - 数字模式XX-XX?

3 个答案:

答案 0 :(得分:1)

您可以使用正则表达式仅在某些情况下执行替换。在这种情况下,如果短划线的 侧是非数字,则需要执行替换。这并不像它可能那么简单,但你可以使用:

string ReplaceSomeHyphens(string input)
{
    string result = Regex.Replace(input, @"(\D)-", "${1} ");
    result = Regex.Replace(result, @"-(\D)", " ${1}");
    return result;
}

有可能在一个正则表达式中有一种更狡猾的方法来做到这一点,但我怀疑它也会更复杂:)

答案 1 :(得分:0)

使用StringBuilder的非常不酷的方法。如果之前的两个字符和后面的两个字符不是数字,它将用空格替换所有-

StringBuilder sb = new StringBuilder();
for (int i = 0; i < text.Length; i++)
{
    bool replace = false;
    char c = text[i];
    if (c == '-')
    {
        if (i < 2 || i >= text.Length - 2) replace = true;
        else
        {
            bool leftDigit = text.Substring(i - 2, 2).All(Char.IsDigit);
            bool rightDigit = text.Substring(i + 1, 2).All(Char.IsDigit);
            replace = !leftDigit || !rightDigit;
        }
    }
    if (replace) 
       sb.Append(' ');
    else 
        sb.Append(c);
}

答案 2 :(得分:0)

由于您说在字符串的开头不会有连字符,因此您需要捕获每个出现的-,其前面是一组包含至少一个字母和零的字符或许多数字。要实现此目的,请在正则表达式中使用positive lookbehind

string strRegex = @"(?<=[a-z]+[0-9]*)-";
Regex myRegex = new Regex(strRegex, RegexOptions.IgnoreCase | RegexOptions.Multiline);
string strTargetString = @"ex250-r-ninja-08-10r_";
string strReplace = @" ";

return myRegex.Replace(strTargetString, strReplace);

以下是结果: Regex execution