C#正则表达式用于挤压每个字符用空格分隔的单词

时间:2017-01-05 08:32:03

标签: c# regex

我正在尝试编写一个正则表达式,将“H e l l o Everyone”之类的单词转换为“Hello Everyone”。

如果是用“大家好,你好吗?”这样的空格隔开的话,那么什么都不应该发生。

基本上所有单个字符都应该被压缩成一个单词,我们可以考虑它是否超过2个字符只是遵循这种模式。

如果它像“a b cdef” - 什么都不应该发生 但是“a b c def” - > “abc def”

我尝试了类似这样的东西“^ \ w(?:(\ s)\ w)* $”但它也与“Hello world”相匹配。

而且,我不确定如何挤压这些单个角色。

非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

我建议匹配用单个空格分隔的单个字符块,然后删除匹配评估器中的空格。

正则表达式是

(?<!\S)\w(?:\s\w){2,}(?!\S)

RegexStorm查看演示。 (?<!\S)(?!\S)确保这些块用空格括起来(或者在字符串的开头/结尾处)。

<强>详情:

  • (?<!\S) - 在当前位置之前确保有空格或字符串开头的负面观察
  • \w - 字母字母(字母/数字/下划线,匹配字母,改为使用\p{L}
  • (?:\s\w){2,} - 2个或更多序列:
    • \s - 空白
    • \w - 一个字char
  • (?!\S) - 一个负面的预测,确保在当前位置之后立即有空格或字符串的开头

请参阅C# demo

var res = Regex.Replace(s, @"(?<!\S)\w(?:\s\w){2,}(?!\S)", m => 
    new string(m.Value
        .Where(c => !Char.IsWhiteSpace(c))
        .ToArray()));

答案 1 :(得分:0)

如果您正在寻找纯正则表达式解决方案,

Regex.Replace(s, @"(?<=^\w|(\s\w)+)\s(?=(\w\s)+|\w$)", string.Empty);

替换一个空格,每边至少有一个空格和字母对没有任何东西(还有一点额外处理字符串的开头/结尾)。