我正在尝试编写一个正则表达式,将“H e l l o Everyone”之类的单词转换为“Hello Everyone”。
如果是用“大家好,你好吗?”这样的空格隔开的话,那么什么都不应该发生。
基本上所有单个字符都应该被压缩成一个单词,我们可以考虑它是否超过2个字符只是遵循这种模式。
如果它像“a b cdef” - 什么都不应该发生 但是“a b c def” - > “abc def”
我尝试了类似这样的东西“^ \ w(?:(\ s)\ w)* $”但它也与“Hello world”相匹配。
而且,我不确定如何挤压这些单个角色。
非常感谢任何帮助。
谢谢!
答案 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);
替换一个空格,每边至少有一个空格和字母对没有任何东西(还有一点额外处理字符串的开头/结尾)。