【问题标题】:Creating a char array for TrimEnd and TrimStart为 TrimEnd 和 TrimStart 创建一个 char 数组
【发布时间】:2015-07-16 16:02:52
【问题描述】:

我必须从我们的 Web 服务客户端项目中的字符串中删除前导和尾随数字字符,因为出于某种原因,挪威另一端的 Web 服务不接受 Nicosia 1121 作为字符串...

所以我决定构建一个可以重复使用的小函数:

public static string CleanNosFromStr(string text, char charsToRemove)
{ 
    var CleanedStr = text.TrimEnd(charsToRemove).TrimStart(charsToRemove);
        return CleanedStr.ToString();
    } 

我想这样称呼它:

char chars2Remove= new string("0,1,2,3,4, 5,6,7,8,9,0, ").Split(",");

wsSoapBody.CardCity = 
myextensions.CleanNosFromStr(aMessage[(int)cardCreate.CardCity].ToString(),chars2Remove);    

但它不会编译...

我得到的编译错误是:

'string.String(char*)' 的最佳重载方法匹配有一些无效参数

参数 1:无法从 'string' 转换为 'char*'

我哪里出错了,有没有更好的方法?

我当然可以使用

wsSoapBody.CardCity = aMessage[(int)cardCreate.CardCity].ToString().TrimEnd
('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ').
TrimStart('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ' ');

但我希望有一些可重复使用的东西。

谢谢

【问题讨论】:

  • 你读过编译错误信息吗? (你应该包括它......)你明白了吗?你明白char是一个单个字符,而不是一个数组吗?
  • 改成char[] charsToRemove
  • @JonSkeet:我确实读过它,但还不够理解。你是对的,我将编辑问题以包含编译错误。
  • 您应该尝试更多地了解诊断问题 - 一旦遇到您不理解的编译器错误,您应该停止而不是引发更多错误。

标签: c# trim


【解决方案1】:

几点:

  1. text.TrimEnd(charsToRemove).TrimStart(charsToRemove) 可以缩写为 text.Trim(charsToRemove)
  2. TrimTrimStartTrimEnd 接受单个或多个字符(请参阅 String.Trim)。
  3. 您的代码new string("0,1,2,3,4, 5,6,7,8,9,0, ").Split(",") 应该是"0,1,2,3,4,5,6,7,8,9, ".Split(',')...
  4. 但最好用"0123456789 ".ToCharArray() 表达。

最后你的代码可能是:

private static readonly char[] NosCharsToRemove = "0123456789 ".ToCharArray();
public static string CleanNosFromStr(string text)
{ 
    return text.Trim(NosCharsToRemove);
}

wsSoapBody.CardCity = myextensions.CleanNosFromStr(aMessage[(int)cardCreate.CardCity].ToString());

【讨论】:

  • 感谢您的扩展和写得好的回答。
【解决方案2】:

如你所愿,从字符串中删除所有数字。

您可以使用 linq 来实现它,只需使用 Char.IsLetter() 过滤所有字母字符:

public static string CleanNosFromStr(string text)
{ 
    var CleanedStr = new String(text.Where(x=>Char.IsLetter(x)).ToArray());
    return CleanedStr;
} 

并使用它:

wsSoapBody.CardCity = 
myextensions.CleanNosFromStr(aMessage[(int)cardCreate.CardCity].ToString());

【讨论】:

    【解决方案3】:

    您可以使用正则表达式。例如,这会将09 之间(包括)值之间的任何字符替换为"",这实际上只是从字符串中删除数字。

    public static string RemoveNumbersFromStr(string text)
    { 
        return Regex.Replace(text, "[0-9]", "");
    }
    

    还有一个用例:

    wsSoapBody.CardCity = 
    myextensions.RemoveNumbersFromStr(aMessage[(int)cardCreate.CardCity].ToString());
    

    或者,如果您希望能够更轻松地进行调试:

    var message = aMessage[(int)cardCreate.CardCity];
    string strMessage = message.ToString();
    
    wsSoapBody.CardCity = myextensions.RemoveNumbersFromStr(strMessage);
    

    【讨论】:

    • 感谢您的回答,但请您添加一些正则表达式的解释
    • 它将09之间(包括)的任何字符替换为""。我会把这个添加到答案中。
    【解决方案4】:

    正则表达式怎么样?

    \d*(\w*)\d*
    

    【讨论】:

    • @AIW:感谢您的回答,但请您扩展您的回答以添加一些关于正则表达式以及如何使用它的解释
    【解决方案5】:

    您也可以使用正则表达式:

    Regex rg = new Regex("\\d+");
    string test = "12345allo12345";
    string result = rg.Replace(test, "");
    

    干杯

    【讨论】:

    • 感谢您的回答,但请您添加一些正则表达式的解释。
    • 当然。正则表达式匹配字符串中任意位置的一个或多个“数字”。使用Regex.Replace 意味着在这种特定情况下,任何匹配的内容都将被替换为空字符串。
    猜你喜欢
    • 2013-04-02
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2015-11-22
    • 2015-12-31
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多