提取仅包含 C# 中字母的字符串
本文关键字:字符串 包含 提取 | 更新日期: 2023-09-27 18:22:21
string input = "5991 Duncan Road";
var onlyLetters = new String(input.Where(Char.IsLetter).ToArray());
输出:邓肯路
但我预计输出是邓肯路。需要改变什么?
对于像您这样的输入,您不需要正则表达式,只需跳过开头的所有非字母符号SkipWhile()
:
只要指定的条件为 true,就会绕过序列中的元素,然后返回其余元素。
C# 代码:
var input = "5991 Duncan Road";
var onlyLetters = new String(input.SkipWhile(p => !Char.IsLetter(p)).ToArray());
Console.WriteLine(onlyLetters);
查看 IDEONE 演示
一个正则表达式解决方案,它将删除不属于单词的数字以及相邻的空格:
var res = Regex.Replace(str, @"'s+(?<!'p{L})'d+(?!'p{L})|(?<!'p{L})'d+(?!'p{L})'s+", string.Empty);
您可以使用这个基于环顾四周的正则表达式:
repl = Regex.Replace(input, @"(?<![a-zA-Z])[^a-zA-Z]|[^a-zA-Z](?![a-zA-Z])", "");
//=> Duncan Road
-
(?<![a-zA-Z])[^a-zA-Z]
匹配前面没有另一个字母的非字母。 -
|
是正则表达式交替 -
[^a-zA-Z](?![a-zA-Z])
匹配一个不后跟另一个字母的非字母。
正则表达式演示
您仍然可以将 LINQ 筛选与 Char.IsLetter || Char.IsWhiteSpace
一起使用。要删除所有前导和尾随空格字符,您可以调用String.Trim
:
string input = "5991 Duncan Road";
string res = String.Join("", input.Where(c => Char.IsLetter(c) || Char.IsWhiteSpace(c)))
.Trim();
Console.WriteLine(res); // Duncan Road