2011-09-06 108 views
22

我有一个字符串,需要来自所述字符串的字母。如何从C#中的字符串只获取字母?

string s = "EMA123_33"; // I need "EMA" 
string s = "EMADRR123_33"; // I need "EMADRR" 

我使用C#在Visual Studio 2008中

+1

如果我可能会问,为什么downvotes和close-votes?好的问题不是“好英语”,但我认为其含义不是很明确 – Carsten

+1

为什么投票下降?是的,他说“字母”时,他的意思是“字母”,但这是一个完全合法的问题。 –

+4

»英文字母«表示»字母«是印度人民的常见错误。只是习惯于这样的事实,即不是来自美国的人使用...... – Joey

回答

50

你可以试试这个:

var myString = "EMA123_33"; 
var onlyLetters = new String(myString.Where(Char.IsLetter).ToArray()); 

请注意:这个版本会发现 “E” 一样, “E” - 如果你只需要大写字母然后做这样的事情:

var myString = "EMA123_33"; 
var onlyLetters = new String(myString.Where(c => Char.IsLetter(c) && Char.IsUpper(c)).ToArray()); 
+2

你不需要使用'Chars'属性,该字符串是可枚举的,但是你需要使用ToArray来为字符串构造器创建一个数组,你不能从一个IEnumerable '中创建一个字符串。 – Guffa

+0

啊 - 谢谢...(没有检查) - 顺便说一句:我认为.Chars更具可读性 - 但这可能是一个口味问题 – Carsten

+0

我甚至无法使用'Chars'来编译它。索引器名为'Chars',所以你可以在VB中使用's.Chars(0)',但在C#中使用'[0]'。 – Guffa

11

您可以使用正则表达式来替换所有非lette RS:

string s2 = Regex.Replace(s, @"[^A-Z]+", String.Empty); 
+2

Carten的答案有使用非罗马字母的好处。你应该考虑使用UTF字符类('\ p {IsLetter}'我认为) –

+0

@Richard Szalay:是的,这是一个替代方案。这取决于OP想要的行为。 – Guffa

+2

\ * twitches \ * Richard,那些是Unicode字符类。实际上,UTF只标记Unicode的转换格式,并不涉及字符集。 – Joey

3

如果你只是初始字母后的时候,也就是那些在字符串的开头(你的例子是有点在不清楚,我不知道会发生什么样的信件在字符串的结尾),你可以使用不同的正则表达式:

string s2 = Regex.Replace(s, @"(\p{L}+).*", "$1"); 
+1

即使这是一个额外的要求,我认为改变Carten的使用'TakeWhile'的答案会更有效,更容易理解/维护。 –

+0

也许,可能不是。在阅读处理字符串操作的代码时,我宁愿使用正则表达式而不是LINQ,我想。 – Joey

+0

公平,但我猜测大多数人更喜欢使用LINQ,而不是使用正则表达式中的Unicode字符类和它们的语法。 –

1
Regex MyRegex = new Regex("[^a-z]", RegexOptions.IgnoreCase); 
string s = MyRegex.Replace(@"your 76% strings &*81 gose _ here and collect you want_{ (7 438 ?. !`", @""); 
Console.WriteLine(s); 

输出

yourstringsgosehereandcollecyouwant

相关问题