2012-07-31 34 views
3

例如,如果我想删除空格从字符串尾随逗号,我可以这样做:有没有更好的方法来修剪字符串中的空白和其他字符?

String x = "abc,\n"; 
x.Trim().Trim(new char[] { ',' }); 

其正确输出abc。我可以很容易地用扩展方法来包装这个,但是我想知道是否有一个内置的方法,只需要调用Trim()即可。我已经习惯了Python的,在那里我可以做到这一点:所有Unicode whitespace characters,除少数例外,被剥离(见注呼叫者节)

import string 
x = "abc,\n" 

x.strip(string.whitespace + ",") 

The documentation状态,但我不知道是否有是一种不需要在扩展方法中手动定义字符数组的方法。

有没有内置的方法来做到这一点?我要删除的非空白字符的数量可能会有所不同,并且不一定包含逗号,并且我想要删除所有空格,而不仅仅是\n

+2

这个问题永远存在于“有少数例外”条款中。当你需要一个Note来告诉大家为什么它不能按预期工作时,api会失去价值。不是.NET方式,你当然可以让它成为你的。 – 2012-07-31 23:33:37

+3

注意,如果在**最后一个不需要的字符之前有空格**,则双重修剪调用失败。例如x =“abc,\ n”。 – MKesper 2016-04-21 11:19:49

回答

4

使用正则表达式,使这个简单的:

text = Regex.Replace(text, @"^[\s,]+|[\s,]+$", ""); 

这将匹配的Unicode空白字符为好。

+0

我假设没有意想不到的后果,例如扩展它。如果我想删除','和'b',只需使用'@“^ [\ s,b] + | [\ s,b] + $”'?这样做只是一个简单的例子,但我想确保我不会错过任何东西。 – 2012-07-31 22:44:39

+0

是的,这工作正常。 – porges 2012-07-31 23:39:34

4

是的,你可以这样做:

x.Trim(new char[] { '\n', '\t', ' ', ',' }); 

因为换行符在技术上是一个字符,可以将其添加到阵列中,避免两次调用Trim

编辑

.NET 4.0使用this method,以确定是否一个字符被认为是空白。早期版本维护一个空白字符的内部列表(Source)。

如果你真的想只用一个电话Trim,那么你的应用程序可以做到以下几点:

  1. 在启动时,扫描the range of Unicode whitespace characters,呼吁每个字符Char.IsWhiteSpace
  2. 如果方法调用返回true,则将该字符推到一个数组上。
  3. 添加自定义字符数组以及

现在你可以使用一个单一的Trim调用,通过传递你构建的阵列。

我猜Char.IsWhiteSpace取决于当前的语言环境,所以你必须小心注意语言环境。

+0

请参阅我的问题的最后一段:“我要删除的非空白字符的数量可能会有所不同,并且不一定包含逗号,并且我希望删除**全部**空白,而不仅仅是\ n。 “我知道我可以手动指定字符,但是如果我想删除* all *空格,我不知道手动定义char []是否知道,只需调用'.Trim()'和*然后*调用' .Trim(new char [] {...})' – 2012-07-31 22:21:36

+0

试试我的编辑。只需在数组中定义空白字符以及您的自定义字符。 – 2012-07-31 22:23:48

+1

只需定义一个包含[所有这些空格字符]的数组(http://en.wikipedia.org/wiki/Whitespace_character#Unicode)?有没有更好的办法?有没有办法获得所有字符的列表或字符数组.NET认为空白? – 2012-07-31 22:24:30

1

你可以有以下的地带扩展方法

public static class ExtensionMethod 
{ 
    public static string Strip(this string str, char[] otherCharactersToRemove) 
    { 
     List<char> charactersToRemove = (from s in str 
           where char.IsWhiteSpace(s) 
           select s).ToList(); 
     charactersToRemove.AddRange(otherCharactersToRemove); 
     string str2 = str.Trim(charactersToRemove.ToArray()); 
     return str2; 
    } 
} 

然后你可以这样调用它:

static void Main(string[] args) 
     { 
      string str = "abc\n\t\r\n , asdfadf , \n \r \t"; 
      string str2 = str.Strip(new char[]{','}); 
     } 

出认沽将是:

str2 = "abc\n\t\r\n , asdfadf" 

大道拓方法首先从列表中获取字符串中的所有WhiteSpace字符。添加其他字符在列表中删除,然后调用修剪。

+1

如果你使用'params Char [] otherCharactersToRemove',你可以用逗号将它们作为参数,而不需要每次在调用代码中生成一个char数组;} – Nyerguds 2015-08-07 12:28:49

+0

@Nyerguds尽管作为[ params](https://msdn.microsoft.com/en-us/library/w5zay9db%28v=vs.140%29.aspx)表明,可以提供可变数量的参数*或*单个数组参数只要数组类型与被调用方法的参数类型相匹配即可。 – DavidRR 2016-05-10 15:22:47

+0

@DavidRR正好。这意味着使用参数意味着你可以给出一个数组,给出元素,或者什么也不给。灵活性。你的观点到底是什么? – Nyerguds 2016-05-13 10:21:02

相关问题