我想确保字符串只包含此范围内的字符
[a-z]&& [A-Z]&& [0-9]&& [ - ]
所以所有字母和数字加上连字符。 我试过这个......
C#App:
char[] filteredChars = { ',', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '=', '{', '}', '[', ']', ':', ';', '"', '\'', '?', '/', '.', '<', '>', '\\', '|' };
string s = str.TrimStart(filteredChars);
这个TrimStart()似乎只能使用没有其他字符的字母,比如$%etc
我实施错了吗? 有没有更好的方法呢?
我只是想避免遍历每个字符串的索引检查,因为会有很多字符串要做...
思想?
谢谢!
答案 0 :(得分:33)
这似乎是使用regular expression的完全正当理由。
bool stringIsValid = Regex.IsMatch(inputString, @"^[a-zA-Z0-9\-]*?$");
在回复米格尔的评论时,您可以执行此操作以删除所有不需要的字符:
string cleanString = Regex.Replace(inputString, @"[^a-zA-Z0-9\-]", "");
请注意,插入符号(^
)现在位于里面字符类中,从而否定它(匹配任何不允许的字符)。
答案 1 :(得分: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());
}
喂它“你好,世界?123!”它将返回“Helloworld123”。
答案 2 :(得分:3)
尝试以下
public bool isStringValid(string input) {
if ( null == input ) {
throw new ArgumentNullException("input");
}
return System.Text.RegularExpressions.Regex.IsMatch(input, "^[A-Za-z0-9\-]*$");
}
答案 3 :(得分:1)
为什么不直接使用替换? Trimstart只会删除列表中的主要字符...
答案 4 :(得分:1)
我相信你会花更多的时间来提出更好的东西,但这会给你一个好主意:
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(" ", "");
}
答案 5 :(得分:0)
我已经在Linqpad 5中测试了这两种解决方案。它们的好处是它们不仅可以用于整数,还可以用于带有数字小数点分隔符(取决于区域性)的小数/浮点数。例如,在挪威,我们使用逗号作为小数点分隔符,而在美国,则使用点。逗号在此处用作千位分隔符。无论如何,首先是Linq版本,然后是Regex版本。最简洁的一点是访问数字分隔符的Thread的static属性,但是您可以在代码顶部使用static对其进行一点压缩,或者更好-将此类功能放入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#中具有文化意识!