过滤字符串

Gab*_*abe 15 c# string filtering

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

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

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

C#App:

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

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

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

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

思考?

谢谢!

Tom*_*han 34

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

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

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

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

请注意,插入符号(^)现在被置于内部的字符类,从而否定它(匹配任何非允许的字符).

  • 你需要在字符串的前面放一个@符号,这样它就不会试图逃避 - :Regex.Replace(s,@"[^ A-z0-9\ - ]",""); (3认同)

Jud*_*ngo 13

使用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());
}
Run Code Online (Sandbox Code Playgroud)

喂它"你好,世界?123!" 它将返回"Helloworld123".

  • 我必须说我喜欢这个,因为你正在避免RegExes =)+1! (2认同)