过滤字符串

我想确保字符串只包含此范围内的字符

[az] && [AZ] && [0-9] && [ – ]

所以所有字母和数字加上连字符。 我试过这个……

C#App:

char[] filteredChars = { ',', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '{', '}', '[', ']', ':', ';', '"', '\'', '?', '/', '.', '', '\\', '|' }; string s = str.TrimStart(filteredChars); 

这个TrimStart()似乎只能使用没有像%%等字符的字母

我做错了吗? 有没有更好的方法呢?

我只是想避免遍历每个字符串的索引检查,因为会有很多字符串要做…

思考?

谢谢!

这似乎是使用正则表达式的完全正当理由。

 bool stringIsValid = Regex.IsMatch(inputString, @"^[a-zA-Z0-9\-]*?$"); 

为回应米格尔的评论,您可以执行此操作以删除所有不需要的字符:

 string cleanString = Regex.Replace(inputString, @"[^a-zA-Z0-9\-]", ""); 

请注意,插入符号( ^ )现在放在字符类中,从而否定它(匹配任何不允许的字符)。

使用LINQ这是一个有趣的方法 – 没有丑陋的循环,没有复杂的RegEx:

 private string GetGoodString(string input) { var allowedChars = Enumerable.Range('0', 10).Concat( Enumerable.Range('A', 26)).Concat( Enumerable.Range('a', 26)).Concat( Enumerable.Range('-', 1)); var goodChars = input.Where(c => allowedChars.Contains(c)); return new string(goodChars.ToArray()); } 

喂它“你好,世界?123!” 它将返回“Helloworld123”。

请尝试以下方法

 public bool isStringValid(string input) { if ( null == input ) { throw new ArgumentNullException("input"); } return System.Text.RegularExpressions.Regex.IsMatch(input, "^[A-Za-z0-9\-]*$"); } 

为什么不直接使用替换? Trimstart只会删除列表中的主要字符…

我相信你可以用更多的时间来提供更好的东西,但这会给你一个好主意:

 public string NumberOrLetterOnly(string s) { string rtn = s; for (int i = 0; i < s.Length; i++) { if (!char.IsLetterOrDigit(rtn[i]) && rtn[i] != '-') { rtn = rtn.Replace(rtn[i].ToString(), " "); } } return rtn.Replace(" ", ""); } 

我已经在Linqpad 5中测试了这两个解决方案。这些解决方案的好处是它们不仅可以用于整数,还可以用于带有数字小数分隔符的小数/浮点数,这取决于文化。 例如,在挪威,我们使用逗号作为小数分隔符,而在美国,使用点。 逗号在那里用作千位分隔符。 无论如何,首先是Linq版本,然后是Regex版本。 最简洁的一点是访问Thread的静态属性以获取数字分隔符,但您可以使用代码顶部的静态压缩这一点,或者更好 – 将此类function放入C#扩展方法,最好具有任意Regex模式的重载。

 string crappyNumber = @"40430dfkZZZdfldslkggh430FDFLDEFllll340-DIALNOWFORCHRISTSAKE.,CAKE-FORFIRSTDIAL920932903209032093294faøj##R#KKL##K"; string.Join("", crappyNumber.Where(c => char.IsDigit(c)|| c.ToString() == Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator)).Dump(); new String(crappyNumber.Where(c => new Regex($"[\\d]+{Thread.CurrentThread.CurrentUICulture.NumberFormat.NumberDecimalSeparator}\\d+").IsMatch(c.ToString())).ToArray()).Dump(); 

注意上面的代码,Dump()方法将结果转储到Linqpad。 您的代码当然会跳过最后一部分。 还要注意我们把它归结为一个衬里,但它仍然有点冗长,可以按照建议放入C#扩展方法。

此外,代替string.join,新增一个新的String对象是更紧凑的语法,更不容易出错。

我们得到了一个糟糕的数字作为输入,但我们设法得到了我们的号码! 它是C#中的文化意识!