您好我尝试从用户输入中删除特殊字符。
public void fd()
{
string output = "";
string input = Console.ReadLine();
char[] charArray = input.ToCharArray();
foreach (var item in charArray)
{
if (!Char.IsLetterOrDigit(item))
{
\\\CODE HERE }
}
output = new string(trimmedChars);
Console.WriteLine(output);
}
最后我把它变回了一根绳子。我的代码只删除字符串中的一个特殊字符。有没有人以更简单的方式提出任何建议
答案 0 :(得分:4)
你有一个很好的实现,只考虑使用下一个代码,它只有一点点,但有一点点抽象
var input = " th@ere's! ";
Func<char, bool> isSpecialChar = ch => !char.IsLetter(ch) && !char.IsDigit(ch);
for (int i = 1; i < input.Length - 1; i++)
{
//if current character is a special symbol
if(isSpecialChar(input[i]))
{
//if previous or next character are special symbols
if(isSpecialChar(input[i-1]) || isSpecialChar(input[i+1]))
{
//remove that character
input = input.Remove(i, 1);
//decrease counter, since we removed one char
i--;
}
}
}
Console.WriteLine(input); //prints " th@ere's "
每次拨打Remove
时都会创建一个新字符串。使用StringBuilder
获得更高内存性能的解决方案。
答案 1 :(得分:2)
您的代码存在的问题是,您从charArray
获取数据并将结果放入trimmedChars
以进行每项更改,因此每次更改都会忽略之前的所有更改并使用原版的。最后你只有最后一次改变。
代码的另一个问题是你使用IndexOf
来获取字符的索引,但这将获得该字符首次出现的索引,而不是获得该字符的索引。例如,当您在字符串!
中的第二个"foo!bar!"
时,您将获得第一个索引。
您无需将字符串转换为数组即可使用字符串中的字符。你可以循环遍历字符串中字符的索引。
请注意,在查看之前和之后的字符时,还应检查索引的值,这样就不会尝试查看字符串之外的字符。
public void fd() {
string input = Console.ReadLine();
int index = 0;
while (index < input.Length) {
if (!Char.IsLetterOrDigit(input, index) && ((index == 0 || !Char.IsLetterOrDigit(input, index - 1)) || (index == input.Length - 1 || !Char.IsLetterOrDigit(input, index + 1)))) {
input = input.Remove(index, 1);
} else {
index++;
}
}
Console.WriteLine(input);
}
答案 2 :(得分:0)
自从我使用C#以来已经有一段时间了,但是一个reg ex可能会有所帮助
string input = string.Format("{0}! ", Console.ReadLine());
Regex rgx = new Regex("(?i:[^a-z]?)[.](?i:[^a-z]?)");
string output = rgx.Replace(input, "$1$2");
正则表达式在左侧或右侧查找带有非alpha字符的字符,并将其替换为空。