如何从字符串中去除非字母数字字符并在C#中用Replace替换空格?如何从字符串中去除非字母数字字符(包括空格)?
我想保留a-z,A-Z,0-9等等(甚至不是空格)。
"Hello there(hello#)".Replace(regex-i-want, "");
应该给
"Hellotherehello"
我试图"Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", "");
,但空间依然存在。
如何从字符串中去除非字母数字字符并在C#中用Replace替换空格?如何从字符串中去除非字母数字字符(包括空格)?
我想保留a-z,A-Z,0-9等等(甚至不是空格)。
"Hello there(hello#)".Replace(regex-i-want, "");
应该给
"Hellotherehello"
我试图"Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", "");
,但空间依然存在。
在你的正则表达式,你已经被排除匹配的空间(和你没有使用Regex.Replace()
我已经完全忽略了...):
result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", "");
应该工作。 +
通过一次匹配多个连续的非字母数字字符而不是逐个匹配,使正则表达式更高效一些。
如果你想保持非ASCII字母/数字,也请使用以下正则表达式:
@"[^\p{L}\p{N}]+"
留下
BonjourmesélèvesGutenMorgenliebeSchüler
,而不是
BonjourmeslvesGutenMorgenliebeSchler
我试过这个......它非常接近,但它似乎留下空间 - 我想他们也被剥光了!谢谢。 – James 2012-01-08 16:52:02
不,它没有。除非你在那里有特殊的空间,如不可破坏的空间ASCII 160(第二个版本也可以正确删除这些空间)。 – 2012-01-08 16:59:29
嗯我尝试以下: '串T = “你好 - (efrwef)”;'' 字符串= “新:” + t.Replace(@“[^ \ p {L} \ p { N}] +“,”“);' 最后是”你好 - (efrwef)“ - 完全不变 - 我知道我在这里做错了事。 – James 2012-01-08 17:04:20
在.Net 4.0中,您可以使用String类的IsNullOrWhitespace方法来删除所谓的空格字符。请看看这里http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx 但@CodeInChaos指出,有很多可以被视为字母和数字的字符。如果您只想查找A-Za-z0-9,则可以使用正则表达式。
做你自己和我的一个忙,并删除它。 – 2016-04-01 16:42:44
或者你也可以这样做:
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();
}
用法:
string text = SomeClass.RemoveNonAlphanumeric("text LaLa (lol) á ñ $ 123 ٠١٢٣٤");
//text: textLaLalol123
虽然我喜欢一般的方法,但它不符合仅允许A-Z,a-z,0-9的要求。它也允许其他字母和数字。 – CodesInChaos 2012-01-08 17:09:15
@CodeInChaos你是对的。修正:) – Adrianne 2012-01-08 17:22:30
unicode也有超过10位数字。 ''就是一些例子。 – CodesInChaos 2012-01-08 17:31:43
上面做出不正确地使用替换是错误的(它没有考虑正则表达式,感谢CodeInChaos)。
下面的代码应该做的是什么规定:
Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex
string regexed = reg.Replace("Hello there(hello#)", "");
这给:
regexed = "Hellotherehello"
使用正则表达式之后,从使用正则表达式的字符串中去除的所有字符。更换
([^A-Za-z0-9\s])
'string.Replace()'不会将正则表达式作为参数 – PostureOfLearning 2014-01-24 02:12:45
@PostureOfLearning谢谢你的评论,但你应该看看这个问题.. quesiton不是关于替换方法,它是关于正则表达式。方法的用法是从它自己提供的有用的正则表达式中复制的。请收回您的投票:) – 2014-01-27 13:38:17
我明白这个问题,我意识到这个问题也有无效的代码。但是,我接受一个问题中的无效代码,因为他们正在尝试学习,但是我发现答案中的错误代码不可接受。这是一个答案,应该工作。寻求解决自己的问题时,你的回答会导致我错误的方向。话虽如此,如果你想改变它,我会很乐意收回选票;) – PostureOfLearning 2014-01-29 03:10:45
var text = "Hello there(hello#)";
var rgx = new Regex("[^a-zA-Z0-9]");
text = rgx.Replace(text, string.Empty);
欢迎来到SO。一点解释总是让你的答案更有价值。在SO上,人们倾向于知道为什么,而不是如何。 ;) – ForceMagic 2012-10-25 00:35:00
而作为作为扩展方法的替换操作:
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('_'));
}
}
您可以使用的LINQ筛选出所需的字符:
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)));
所以你必须在正则表达式没有必要。
伟大的增加!知道这与Regex解决方案的相对性能会很有趣。走出门外,它读得更好。 – 2016-04-01 16:45:45
LinqPad的快速测试表明,这与甚至编译的Regex解决方案之间的差异可以忽略不计。可读性为我赢得。 – 2016-04-01 21:54:02
首先通过字母数字定义你的意思,然后怎么样?你只想要A-Z,A-Z,0-9? Unicode有更多的字母和数字。 – CodesInChaos 2012-01-08 16:36:40
通过编辑,它看起来好多了 - 收回我的反对票。 – 2012-01-08 16:46:42
为什么你的支架有空间?而'string.Replace'首先并不需要正则表达式。 – CodesInChaos 2012-01-08 17:04:13