Regex 如何从特定字符串中删除额外的空格?

Regex 如何从特定字符串中删除额外的空格?,regex,vb.net,string,replace,tags,Regex,Vb.net,String,Replace,Tags,我有一个字符串,如下所示: Ireland, UK, United States of America, Belgium, Germany , Some Country, ... 我需要有关正则表达式或字符串的帮助。替换函数以删除额外空格,结果如下: Ireland,UK,United States of America,Belgium,Germany,Same Country, 谢谢。您可以通过使用逗号分割输入,然后将多个空格修剪并缩小为1和字符串来实现这一点 仅展示如

我有一个字符串,如下所示:

Ireland, UK, United States of America,     Belgium, Germany   , Some     Country, ...
我需要有关正则表达式或字符串的帮助。替换函数以删除额外空格,结果如下:

Ireland,UK,United States of America,Belgium,Germany,Same Country,

谢谢。

您可以通过使用逗号分割输入,然后将多个空格修剪并缩小为1和字符串来实现这一点

仅展示如何使用LINQ进行此操作:

Console.Write(String.Join(",", _
    "Ireland, UK, United States of America,     Belgium, Germany   , Some     Country," _
     .Split(","c) _
     .Select(Function(m) Regex.Replace(m.Trim(), "\p{Zs}{2,}", " ")) _
     .ToArray()))
关键是Regex.Replacem.Trim,\p{Zs}{2,},其中多个空间被压缩为1


结果:爱尔兰、英国、美利坚合众国、比利时、德国、一些国家,

您可以通过使用逗号分割输入,然后将多个空格修剪并缩小为1和字符串来实现

仅展示如何使用LINQ进行此操作:

Console.Write(String.Join(",", _
    "Ireland, UK, United States of America,     Belgium, Germany   , Some     Country," _
     .Split(","c) _
     .Select(Function(m) Regex.Replace(m.Trim(), "\p{Zs}{2,}", " ")) _
     .ToArray()))
关键是Regex.Replacem.Trim,\p{Zs}{2,},其中多个空间被压缩为1


结果:爱尔兰、英国、美利坚合众国、比利时、德国、一些国家,

尽管斯特里比雪夫的回答对这种情况很好,但我想借此机会强调使用regex完成简单任务对性能的负面影响

另外,x2的速度明显快于正则表达式,在处理这些情况时,正则表达式总是非常慢

我的方法基于递归删除空格。我创建了两个版本:第一个版本使用不带regex的常规循环,第二个版本使用不带regex的LINQ;实际上,除了正则表达式部分之外,它与斯特里比雪夫的答案是相同的

这是一个简单的测试框架,它分析非常快速的动作,其中每一位都很重要。20次循环迭代的点正是试图稍微提高测量的可靠性。也就是说:即使更改方法的调用顺序,结果也会受到影响

在任何情况下,方法之间的差异在我所有的测试中都或多或少地保持一致。我在一些测试后得到的平均值是:

With: 2500-2700
Without: 1100-1300
Without2: 900-1200

注意:这是对regex性能的一般批评,至少在简单的情况下,可能很容易被我在这里展示的内容中的替代品所取代,任何关于如何在.NET中改进它的regex性能的建议都是非常受欢迎的。但是,请避免一般性的不明确陈述,并尽可能具体,例如,建议对提议的测试框架进行更改。

尽管斯特里比雪夫的回答适合这种情况,我想借此机会强调使用regex执行简单任务对性能的负面影响

另外,x2的速度明显快于正则表达式,在处理这些情况时,正则表达式总是非常慢

我的方法基于递归删除空格。我创建了两个版本:第一个版本使用不带regex的常规循环,第二个版本使用不带regex的LINQ;实际上,除了正则表达式部分之外,它与斯特里比雪夫的答案是相同的

这是一个简单的测试框架,它分析非常快速的动作,其中每一位都很重要。20次循环迭代的点正是试图稍微提高测量的可靠性。也就是说:即使更改方法的调用顺序,结果也会受到影响

在任何情况下,方法之间的差异在我所有的测试中都或多或少地保持一致。我在一些测试后得到的平均值是:

With: 2500-2700
Without: 1100-1300
Without2: 900-1200

注意:这是对regex性能的一般批评,至少在简单的情况下,可能很容易被我在这里展示的内容中的替代品所取代,任何关于如何在.NET中改进它的regex性能的建议都是非常受欢迎的。但是,请避免泛泛的不清楚的陈述,并尽可能具体,例如,建议对提议的测试框架进行更改。

OMG这很容易。。。我没想到。谢谢用逗号、trim和字符串拆分。返回。不确定,因为您有一些国家有很多空格,而在预期输出中,同一个国家只有一个空格。这是真的吗?我猜String.Join、、爱尔兰、英国、美利坚合众国、比利时、德国、一些国家、、Split、c.selectfunction m m.Trim.ToArray将不起作用。天哪,那很容易。。。我没想到。谢谢用逗号、trim和字符串拆分。返回。不确定,因为您有一些国家有很多空格,而在预期输出中,同一个国家只有一个空格。这是真的吗?我猜String.Join、、爱尔兰、英国、美利坚合众国、比利时、德国、某些国家、.Split、c.SelectFunctionm m m.Trim.ToArray将不起作用。对于声明为静态只读的已编译正则表达式,性能没有问题。@Stribizev我是如何做到的?公共静态共享变量只读?我想测试最好的正则表达式条件和confir
m/驳回我的假设。请帮帮我@Stribizov在这里您有一个随时可用的测试框架。根据需要修改它,并向我展示OP和未来的读者如何改进regex的性能。我写这篇文章是因为我认为它是相关的,如果你证明它不是,我会删除它,也会学习如何正确使用正则表达式,甚至可能在不久的将来改变我在这方面的做法。有点令人惊讶的行为!无论如何重点是,在这种情况下,正则表达式显然较慢+一种更快的递归替代方法,而且似乎没有太多人完全意识到这一事实,我将在这里暂时给出答案。您参与测试性能时忽略了我们的解决方案不同这一事实:我的解决方案删除了所有Unicode空格,例如硬盘空间&0160;而您的仅删除常规的32代码空间。嗯,我同意,只要删除32个空间,任何非正则表达式解决方案都会更快。不过,当我们不知道输入字符串中等待我们的空格是什么时,使用正则表达式是一种救命稻草。对于声明为静态只读的已编译正则表达式,性能没有问题。@Stribizev我是如何做到的?公共静态共享变量只读?我想测试最佳正则表达式条件,并确认/驳回我的假设。请帮帮我@Stribizov在这里您有一个随时可用的测试框架。根据需要修改它,并向我展示OP和未来的读者如何改进regex的性能。我写这篇文章是因为我认为它是相关的,如果你证明它不是,我会删除它,也会学习如何正确使用正则表达式,甚至可能在不久的将来改变我在这方面的做法。有点令人惊讶的行为!无论如何重点是,在这种情况下,正则表达式显然较慢+一种更快的递归替代方法,而且似乎没有太多人完全意识到这一事实,我将在这里暂时给出答案。您参与测试性能时忽略了我们的解决方案不同这一事实:我的解决方案删除了所有Unicode空格,例如硬盘空间&0160;而您的仅删除常规的32代码空间。嗯,我同意,只要删除32个空间,任何非正则表达式解决方案都会更快。尽管如此,当我们不知道输入字符串中等待我们的空格是什么时,使用正则表达式仍然是一个救世主。
With: 2500-2700
Without: 1100-1300
Without2: 900-1200