C# 如何从字符串中去除非字母数字字符(包括空格)?
如何用Replace从C#中的字符串和空格中去掉非字母数字字符 我想保留a-z,a-z,0-9,什么都不要(甚至连“空格”都不要) 应该给C# 如何从字符串中去除非字母数字字符(包括空格)?,c#,asp.net,.net,regex,C#,Asp.net,.net,Regex,如何用Replace从C#中的字符串和空格中去掉非字母数字字符 我想保留a-z,a-z,0-9,什么都不要(甚至连“空格”都不要) 应该给 "Hellotherehello" 我尝试了“你好(Hello#)”。替换(@“[^A-Za-z0-9]”,“”)但空格保留。在.Net 4.0中,可以使用String类的IsNullOrWhitespace方法删除所谓的空格字符。请看这里 然而,正如@CodeInChaos所指出的,有很多字符可以被视为字母和数字。如果您只想找到a-Za-z0-9,则可以
"Hellotherehello"
我尝试了
“你好(Hello#)”。替换(@“[^A-Za-z0-9]”,“”)代码>但空格保留。在.Net 4.0中,可以使用String类的IsNullOrWhitespace方法删除所谓的空格字符。请看这里
然而,正如@CodeInChaos所指出的,有很多字符可以被视为字母和数字。如果您只想找到a-Za-z0-9,则可以使用正则表达式。在您的正则表达式中,您已经排除了匹配的空格(并且您没有使用我完全忽略的regex.Replace()
):
应该有用。+
一次匹配多个连续的非字母数字字符,而不是一个接一个地匹配,从而使正则表达式的效率更高
如果还希望保留非ASCII字母/数字,请使用以下正则表达式:
@"[^\p{L}\p{N}]+"
剩下的
BonjourmesélèvesGutenMorgenliebeSchüler
而不是
BonjourmeslvesGutenMorgenliebeSchler
或者你也可以这样做:
public static string RemoveNonAlphanumeric(string text)
{
StringBuilder sb = new StringBuilder(text.Length);
for (int i = 0; i < text.Length; i++)
{
char c = text[i];
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
sb.Append(text[i]);
}
return sb.ToString();
}
上面所犯的错误是错误地使用了Replace(这不需要regex,谢谢CodeInChaos)
以下代码应执行指定的操作:
Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex
string regexed = reg.Replace("Hello there(hello#)", "");
这使得:
regexed = "Hellotherehello"
使用以下正则表达式可以使用regex.Replace从字符串中删除所有字符
([^A-Za-z0-9\s])
作为替换操作和扩展方法:
public static class StringExtensions
{
public static string ReplaceNonAlphanumeric(this string text, char replaceChar)
{
StringBuilder result = new StringBuilder(text.Length);
foreach(char c in text)
{
if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
result.Append(c);
else
result.Append(replaceChar);
}
return result.ToString();
}
}
您可以使用Linq筛选出所需的字符:
String source = "Hello there(hello#)";
// "Hellotherehello"
String result = new String(source
.Where(ch => Char.IsLetterOrDigit(ch))
.ToArray());
或
因此,不需要正则表达式。首先定义字母数字的确切含义如何?你只想要A-Z,A-Z,0-9吗?Unicode有更多的字母和数字。通过这种编辑,它看起来更好——收回我的负数。为什么括号中有空格?和string.Replace
一开始不需要正则表达式。只是要明确一点:你也不需要像ä
这样的字母吗?我在回答我的问题时考虑了你的提示(见下文)。我尝试了这个…它非常接近,但似乎留下了空格-我也希望它们被去掉!谢谢。不,没有。除非其中有特殊的空格,比如不可破空格ASCII 160(第二个版本也正确地删除了这些空格)
string a=“New:”+t.Replace(@“[^\p{L}\p{N}]+”,”)代码>和a最后是“你好-(efrwef)”-完全不变-我知道我在这里做错了。string.Replace
不接受正则表达式。AHHH可以解释一切。那么,我如何使用C#中的正则表达式比特和片段实现上面描述的功能呢?虽然我喜欢一般的方法,但它不符合只允许A-Z,A-Z,0-9的要求。它还允许其他字母和数字。unicode中也有10多个数字<代码>是一些示例。抱歉,它仍然是错误的ToLower
使用当前区域设置。因此,当您在土耳其运行时,它将不允许I
,而是允许İ
@CodeInChaos哇。。。我想是我的懒惰让我这么做的。修正:)欢迎如此。一个小小的解释总是让你的答案更有价值。因此,人们往往喜欢知道为什么,而不是如何string.Replace()'不将正则表达式作为argument@PostureOfLearning谢谢你的评论,但你应该看看这个问题。。问题不在于替换方法,而在于正则表达式。方法的用法是从它自己提供的问题中复制出来的,该问题带有有用的正则表达式。请收回您的投票:)我理解这个问题,我意识到这个问题也有无效代码。但是,我接受问题中的无效代码,因为他们正在尝试学习,但我发现答案中的错误代码是不可接受的。这是一个答案,应该有效。当我想解决自己的问题时,你的回答把我引向了错误的方向。话虽如此,如果你想改变它,我很乐意收回选票;)帮你自己一个忙,把这个去掉。很好的补充!如果您想知道它与正则表达式解决方案的相对性能,那将非常有趣。在LinqPad中的一个快速测试表明,即使是一个已编译的正则表达式解决方案,它也与正则表达式解决方案之间的差别可以忽略不计。可读性为我赢得了胜利。看起来非常整洁和可读,如果性能相同,我正在使用它,谢谢。注意:对于像我这样的新程序员,这意味着您需要使用System.Linq添加行代码>位于文件顶部,以便C#编译器识别方法Where
。
([^A-Za-z0-9\s])
var text = "Hello there(hello#)";
var rgx = new Regex("[^a-zA-Z0-9]");
text = rgx.Replace(text, string.Empty);
public static class StringExtensions
{
public static string ReplaceNonAlphanumeric(this string text, char replaceChar)
{
StringBuilder result = new StringBuilder(text.Length);
foreach(char c in text)
{
if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9')
result.Append(c);
else
result.Append(replaceChar);
}
return result.ToString();
}
}
[TestFixture]
public sealed class StringExtensionsTests
{
[Test]
public void Test()
{
Assert.AreEqual("text_LaLa__lol________123______", "text LaLa (lol) á ñ $ 123 ٠١٢٣٤".ReplaceNonAlphanumeric('_'));
}
}
String source = "Hello there(hello#)";
// "Hellotherehello"
String result = new String(source
.Where(ch => Char.IsLetterOrDigit(ch))
.ToArray());
String result = String.Concat(source
.Where(ch => Char.IsLetterOrDigit(ch)));