繁体   English   中英

从字符串中删除字符的问题

[英]Issue with Removing characters from a string

我已经看到了许多有关如何使用c#编辑字符串中的字符的答案。

但是,我需要一个只考虑使用字符串类方法删除的回复(也是为了避免使用stringbuilder)。

这只是为了让我可以看到这个特定代码的问题是什么,它似乎没有摆脱电话号码中的中间空白。 该代码还删除了不是数字的任何其他字符。

到目前为止,我一直无法理解为什么空白或两个相邻空白不会被删除。 我怀疑也许对同一个字符串的自我分配可能是一个问题,但我不确定。

//leave only the digits
for (int i = 0; i < enteredPhone.Length; i++)
{
     switch (enteredPhone[i])
     {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
           break;

        default:
             //gets rid of any other type of character
             enterPhone = enteredPhone.Remove(i, 1);
             break;
        }
   }

提前致谢。

删除角色时,尝试减1。 因为如果删除位置5和i ++上的角色,i的值现在为5,则循环将找不到下一个角色。 像这样:

default:
         //gets rid of any other type of character
         enterPhone = enteredPhone.Remove(i, 1);
         i--;
         break;

您的问题是每次都增加索引,即使您删除了非数字字符也是如此。 在这种情况下,下一个字符将具有当前索引,但在下一个循环中,您将递增当前索引,从而跳过下一个字符。 使用while代替for

int index = 0;
while(index < enteredPhone.Length)
{
    switch (enteredPhone[index])
    {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
            index++;
            break;

        default:                
            enteredPhone = enteredPhone.Remove(index, 1);
            break;
    }
}

您也可以使用Char.IsDigit简化此循环:

int index = 0;
while(index < enteredPhone.Length)
{
    if (Char.IsDigit(enteredPhone[index]))
    {
        index++;
        continue;
    }

    enteredPhone = enteredPhone.Remove(index, 1);
}

忽略你奇怪的要求:

Regex.Replace(inputString, @"\D", string.Empty)
var onlyDigits = new string(enteredPhone.Where(Char.IsDigit).ToArray());

应该比正则表达更有效率。

“为什么空白或两个相邻的空格不会被删除” -因为所有的字符索引后, i被减1,当你.Remove i

向后走绳 - 从Length-10

你也可以试试。 但我相信Linq或Regex解决方案是更好的选择。

//leave only the digits
for (int i = enteredPhone.Length - 1; i >= 0; i--)
{
    if (!Char.IsDigit(enteredPhone[i]))
    {
       enterPhone = enteredPhone.Remove(i, 1);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM