使用正则表达式从C#字符串中删除所有空格

48

我正在构建一个由连字符分隔的姓氏字符串。有时会有空格混杂其中。我需要从最终结果中删除所有空格。

要处理的示例字符串:

  

Anderson -Reed-Smith

它的最终形式应为(Anderson后面没有空格):

  

Anderson-Reed-Smith

姓氏字符串保存在字符串变量LastName中。

我正在使用正则表达式:

Regex.Replace(LastName, @"[\s+]", "");
这的结果是:

安德森-里德-史密斯。

我还尝试了:
Regex.Replace(LastName, @"\s+", "");

Regex.Replace(LastName, @"\s", "");

我做错了什么?


如果字符串中只有名称数据,您不需要使用正则表达式。否则,您可能可以使用(-|- | -)。 - Evo510
9个回答

143

对于那么简单的东西,不要使用RegEx,而应该使用Replace

LastName = LastName.Replace(" ", String.Empty);

3
这个。我现在想为这个回答投票,但我今天的投票次数已经用完了。 - Geeky Guy
1
不知道有限制! - Julián Urbano
24
请勿使用制表符或空格字符以外的其他空格字符(顺序号为32的空格字符)。 - maxwellb
@maxwellb - 从原帖来看,他们似乎只涉及“空格”。 - Gabe
不确定问题出在哪里,我尝试了上述方法,但仍然无法正常工作,然后我删除了早期对.Trim的调用,然后它开始正常工作。我猜它不喜欢重复查看同一件事情。无论如何,现在我可以继续了。 - BattlFrog
@maxwellb,那么你对此有什么建议? - Mehrad

68

Regex.Replace不修改其第一个参数(请记住,.NET中的字符串是不可变的),因此调用

Regex.Replace(LastName, @"\s+", "");

保留LastName字符串不变。你需要这样调用它:

LastName = Regex.Replace(LastName, @"\s+", "");

您的三个正则表达式都可以使用。但是,第一个正则表达式也会删除所有加号字符,这可能不是您想要的结果。


这应该是原问题的正确答案。 - Ishikawa

14

无需正则表达式。这也会删除制表符、换行符等。

var newstr = String.Join("",str.Where(c=>!char.IsWhiteSpace(c)));

空格字符:0009,000a,000b,000c,000d,0020,0085,00a0,1680,180e,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,200a,2028,2029,202f,205f,3000


5
有一个问题。想用正则表达式解决它。现在我有两个问题。用LINQ解决它。还是两个问题 :-) - Julián Urbano
1
@JuliánUrbano 是的,正则表达式可能在维护时会有问题,但我不能说LINQ也是这样。 - I4V
1
@JuliánUrbano,你不应该因为某个特定的API而想要解决任何问题。在这个网站上,有太多的问题被用LINQ回答了,即使实质上它可以更容易、更快地解决。选择最好的解决方案。 - Moo-Juice

3

最快且通用的方法是这样做(包括行终止符和制表符). 不需要使用正则表达式强大的功能来解决此问题,但是使用正则表达式可能会降低性能。

                       new string
                           (stringToRemoveWhiteSpaces
                                .Where
                                (
                                    c => !char.IsWhiteSpace(c)
                                )
                                .ToArray<char>()
                           )

或者

                       new string
                           (stringToReplaceWhiteSpacesWithSpace
                                .Select
                                (
                                    c => char.IsWhiteSpace(c) ? ' ' : c
                                )
                                .ToArray<char>()
                           )

1
顺便说一下,我在这里的第一个代码片段(stringToRemoveWhiteSpaces)和I4V发布的String.Join代码之间进行了基准测试,你的新String(stringToRemoveWhiteSpaces...)代码运行速度大约快了40%。 - Jerren Saunders
@JerrenSaunders 但是与正则表达式解决方案相比呢?:-D - ilasno
我不能说我测试过正则表达式的解决方案。我倾向于同意CSharpCoder在这个答案中的评论,即正则表达式的开销有时对于更简单的任务来说可能太大了。话虽如此,为了公平起见,在没有进行基准测试之前,我不应该做出这样的假设。 - Jerren Saunders
每个操作执行10M次时的基准结果:第一个片段(.Where):10813个滴答声,I4V的Join/Where:13140个滴答声,dasblinkenlight的Regex.Replace:22969个滴答声,以及Gabe的被接受的答案:1297个滴答声。 - Jerren Saunders

1
使用正则表达式可以去除字符串中的空格。 下面的名称空间是必需的。
using System.Text.RegularExpressions;

语法:

Regex.Replace(text, @"\s", "")

0
在我的情况下,我让你去除空格:
   var year = System.Text.RegularExpressions.Regex.Replace(space, @"&nbsp;", string.Empty).Replace("Year: ", string.Empty).Trim();

0

你可以这样写,例如电话号码:

private static string GetFormattedPhoneNumber(string phoneNumber)
    => string.IsNullOrEmpty(phoneNumber) ? string.Empty 
    : Regex.Replace(phoneNumber, @"[+,\-,\(,\), \s+]*", string.Empty);

static void Main(string[] args)
    {
       Console.WriteLine(GetFormattedPhoneNumber("+375 (24) 55-333 "));
    }
/*
    Output: 3752455333
*/

-2
以下是代码,可以将文件名中的空格替换为给定的URL,我们也可以使用string.empty而不是“~”来删除相同的内容。
  if (!string.IsNullOrEmpty(url))
          {
           string origFileName = Path.GetFileName(url);
           string modiFileName = origFileName.Trim().Replace(" ", "~");
           url = url.Replace(origFileName , modiFileName );
          }
          return url;

Op说:“我需要删除所有的空格”,并使用了\s。但这只处理了“ ”空格,而且大多数情况下与此无关。而Trim()仅处理前导和尾随空格。我不认为它适合。 - Drag and Drop

-3
为什么要使用正则表达式,而不是简单地使用Trim()方法?
Text='<%# Eval("FieldDescription").ToString().Trim() %>'

或者

string test = "Testing    ";
test.Trim();

2
他需要移除所有空格,而不仅仅是前导和尾随的空格。 - Gianpiero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接