2012-01-08 258 views
41

如何从字符串中去除非字母数字字符并在C#中用Replace替换空格?如何从字符串中去除非字母数字字符(包括空格)?

我想保留a-z,A-Z,0-9等等(甚至不是空格)。

"Hello there(hello#)".Replace(regex-i-want, ""); 

应该给

"Hellotherehello" 

我试图"Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", "");,但空间依然存在。

+1

首先通过字母数字定义你的意思,然后怎么样?你只想要A-Z,A-Z,0-9? Unicode有更多的字母和数字。 – CodesInChaos 2012-01-08 16:36:40

+2

通过编辑,它看​​起来好多了 - 收回我的反对票。 – 2012-01-08 16:46:42

+1

为什么你的支架有空间?而'string.Replace'首先并不需要正则表达式。 – CodesInChaos 2012-01-08 17:04:13

回答

55

在你的正则表达式,你已经被排除匹配的空间(和你没有使用Regex.Replace()我已经完全忽略了...):

result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", ""); 

应该工作。 +通过一次匹配多个连续的非字母数字字符而不是逐个匹配,使正则表达式更高效一些。

如果你想保持非ASCII字母/数字,也请使用以下正则表达式:

@"[^\p{L}\p{N}]+" 

留下

BonjourmesélèvesGutenMorgenliebeSchüler 

,而不是

BonjourmeslvesGutenMorgenliebeSchler 
+0

我试过这个......它非常接近,但它似乎留下空间 - 我想他们也被剥光了!谢谢。 – James 2012-01-08 16:52:02

+0

不,它没有。除非你在那里有特殊的空间,如不可破坏的空间ASCII 160(第二个版本也可以正确删除这些空间)。 – 2012-01-08 16:59:29

+0

嗯我尝试以下: '串T = “你好 - (efrwef)”;'' 字符串= “新:” + t.Replace(@“[^ \ p {L} \ p { N}] +“,”“);' 最后是”你好 - (efrwef)“ - 完全不变 - 我知道我在这里做错了事。 – James 2012-01-08 17:04:20

3

或者你也可以这样做:

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 
+1

虽然我喜欢一般的方法,但它不符合仅允许A-Z,a-z,0-9的要求。它也允许其他字母和数字。 – CodesInChaos 2012-01-08 17:09:15

+0

@CodeInChaos你是对的。修正:) – Adrianne 2012-01-08 17:22:30

+0

unicode也有超过10位数字。 ''就是一些例子。 – CodesInChaos 2012-01-08 17:31:43

2

上面做出不正确地使用替换是错误的(它没有考虑正则表达式,感谢CodeInChaos)。

下面的代码应该做的是什么规定:

Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex 
string regexed = reg.Replace("Hello there(hello#)", ""); 

这给:

regexed = "Hellotherehello" 
-2

使用正则表达式之后,从使用正则表达式的字符串中去除的所有字符。更换

([^A-Za-z0-9\s]) 
+0

'string.Replace()'不会将正则表达式作为参数 – PostureOfLearning 2014-01-24 02:12:45

+0

@PostureOfLearning谢谢你的评论,但你应该看看这个问题.. quesiton不是关于替换方法,它是关于正则表达式。方法的用法是从它自己提供的有用的正则表达式中复制的。请收回您的投票:) – 2014-01-27 13:38:17

+2

我明白这个问题,我意识到这个问题也有无效的代码。但是,我接受一个问题中的无效代码,因为他们正在尝试学习,但是我发现答案中的错误代码不可接受。这是一个答案,应该工作。寻求解决自己的问题时,你的回答会导致我错误的方向。话虽如此,如果你想改变它,我会很乐意收回选票;) – PostureOfLearning 2014-01-29 03:10:45

0
var text = "Hello there(hello#)"; 

var rgx = new Regex("[^a-zA-Z0-9]"); 

text = rgx.Replace(text, string.Empty); 
+1

欢迎来到SO。一点解释总是让你的答案更有价值。在SO上,人们倾向于知道为什么,而不是如何。 ;) – ForceMagic 2012-10-25 00:35:00

2

而作为作为扩展方法的替换操作:

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('_')); 
    } 
} 
9

您可以使用的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))); 

所以你必须在正则表达式没有必要。

+0

伟大的增加!知道这与Regex解决方案的相对性能会很有趣。走出门外,它读得更好。 – 2016-04-01 16:45:45

+1

LinqPad的快速测试表明,这与甚至编译的Regex解决方案之间的差异可以忽略不计。可读性为我赢得。 – 2016-04-01 21:54:02

相关问题