在C#中提取仅包含字母的字符串
Posted
技术标签:
【中文标题】在C#中提取仅包含字母的字符串【英文标题】:Extract string that contains only letters in C# 【发布时间】:2016-02-18 15:00:30 【问题描述】: string input = "5991 Duncan Road";
var onlyLetters = new String(input.Where(Char.IsLetter).ToArray());
输出:DuncanRoad
但我预计输出是邓肯路。需要改变什么?
【问题讨论】:
使用带有全局标志的正则表达式[a-zA-Z ]+
,然后修剪字符串。检查demo
【参考方案1】:
对于像你这样的输入,你不需要正则表达式,只需跳过所有以SkipWhile()
开头的非字母符号:
只要指定条件为真,就绕过序列中的元素,然后返回剩余的元素。
C#代码:
var input = "5991 Duncan Road";
var onlyLetters = new String(input.SkipWhile(p => !Char.IsLetter(p)).ToArray());
Console.WriteLine(onlyLetters);
见IDEONE demo
一个 regx 解决方案,它将删除不属于单词的数字以及相邻的空格:
var res = Regex.Replace(str, @"\s+(?<!\pL)\d+(?!\pL)|(?<!\pL)\d+(?!\pL)\s+", string.Empty);
【讨论】:
如果输入为"5991 Duncan Road 34 ABC"
,则输出为Duncan Road 34 ABC
,其中不仅包含字母。这是你想要的吗?
以防万一需要删除 5991
和 34
并使用正确的间距,请使用 \s+(?<!\pL)\d+(?!\pL)|(?<!\pL)\d+(?!\pL)\s+
。 C#:var res = Regex.Replace(str, @"\s+(?<!\pL)\d+(?!\pL)|(?<!\pL)\d+(?!\pL)\s+", string.Empty);
请注意,您接受的答案会混淆结果字符串中的空格并删除属于字母数字单词的数字。我上面的正则表达式更优雅地处理了这些情况。
@stribizhev:非常感谢。【参考方案2】:
您可以使用这个基于环视的正则表达式:
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])
匹配后面没有另一个字母的非字母。
RegEx Demo
【讨论】:
字符串输入 = "5991 邓肯路";预期输出:邓肯。如何从正则表达式中获取此输出。? - @阿努 感谢您@Anu 的回复。在“5991 Duncan Road De TB”中。在这里,我只需要在不使用数组的情况下获得第二项“Duncan”。常规exp可以吗? 很抱歉说“它正在返回“邓肯路德结核病”。 @阿努。 抱歉,我认为您要么不理解正则表达式,要么没有正确实现它。从 cmets 提出问题和提供答案也很困难。无论如何,如果您使用其他不使用正则表达式的答案,那么为什么要寻找正则表达式答案? 对不起。我没注意到。【参考方案3】:您仍然可以通过 Char.IsLetter || Char.IsWhiteSpace
使用 LINQ 过滤。要删除所有前导和尾随空格字符,您可以调用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
【讨论】:
感谢您的回复。如果我只需要字符串中的“Duncan”(仅表示第二项)。是否可以使用 LINQ 过滤? @RajeshD - 您可以使用String.Split
和索引,例如var secondWord = input.Split()[1];
@Thanks w.b.. 非常感谢。以上是关于在C#中提取仅包含字母的字符串的主要内容,如果未能解决你的问题,请参考以下文章