删除空白:C#

本文关键字:空白 删除 | 更新日期: 2023-09-27 18:29:18

我正在尝试String input中存在的remove white space。我的最终目标是创建一个infix计算器,但我在解析输入表达式时遇到了问题。

在我看来,解决这个问题的简单方法是使用Regular Expression函数,即Regex.Replace(...)

这是我到目前为止所拥有的。。

infixExp = Regex.Replace(infixExp, "''s+", string.Empty);
string[] substrings = Regex.Split(infixExp, "(''()|(''))|(-)|(''+)|(''*)|(/)");

假设用户输入中缀表达式(2+3)*4,我预计这会将字符串分解为数组{(, 2, +, 3, ), *, 4};但是,在调试之后,我得到了以下输出:

infixExp = "(2+3)*7"
substrings = {"", (, 2, +, 3, ), "", *, 7}

似乎从中缀表达式中正确地删除了空白,但拆分结果字符串是不正确的。

有人能告诉我为什么吗?同样,如果你有任何建设性的批评或建议,请告诉我!

删除空白:C#

如果一个匹配项在字符串的一端,那么它旁边会有一个空匹配项。同样,如果有两个相邻的匹配项,那么字符串会在这两个匹配项上都被拆分,所以你最终会得到一个空字符串。引用MSDN:

如果多个匹配项彼此相邻,则会在数组中插入一个空字符串。例如,在单个连字符上拆分字符串会导致返回的数组在找到两个相邻连字符的位置包含一个空字符串[…]。

如果在输入字符串的开头或结尾找到匹配项,则在返回数组的开头或末尾会包含一个空字符串。

只需在第二步中过滤掉它们。

此外,请让你的生活更轻松,并使用逐字逐句的字符串:

infixExp = Regex.Replace(infixExp, @"'s+", string.Empty);
string[] substrings = Regex.Split(infixExp, @"('(|')|-|'+|'*|/)");

第二个表达式可以进一步简化:

@"([()+*/-])"

请抛弃Regex。有更好的工具可以使用。可以使用String.Trim().TrimEnd().TrimStart()

string inputString = "   asdf    ";
string output = inputString.Trim();

对于字符串中的空白,请使用String.Replace

string output2 = output.Replace(" ", "");

您必须将其扩展到其他空白字符。

var result = Regex.Split(input, "(''d+|''D)")
              .Where(x=>x!="").ToArray();

m.buettner的答案是正确的。还要考虑一下,你可以一步到位。来自MSDN:

如果在Regex.Split表达式中使用捕获圆括号,则捕获的文本包含在结果字符串数组中。

因此,如果在分割模式中包含空白,但在捕获圆括号之外,则也可以对其进行分割,但不将其包含在结果数组中:

var substrings = Regex.Split("(2 + 3) * 7", @"([()+*/-])|'s+");

结果:

substrings = {"", ( , 2, "", +, "", 3, ), "", "", *, "", 7}

你的最终结果是:

substrings.Where(s => s != String.Empty)

为什么不去掉空白,然后用正常的字符串处理函数拆分字符串?像这样。。。

string x = "(2 + 3) * 4";
x = x.Replace(" ", "").Replace("'t",""); //etc...
char[] y = x.ToCharArray();

为什么要麻烦把它变得比需要的更复杂呢?

非正则表达式的解决方案可能是String.Replace-您可以简单地用空字符串"替换"、"''t"和其他空白。

感谢您的回复,我找到了我想要的解决方案。

// Ignore all whitespace within the expression.
infixExp = Regex.Replace(infixExp, @"'s+", String.Empty);
// Seperate the expression based on the tokens (, ), +, -, 
// *, /, and ignore any of the empty Strings that are added
// due to duplicates.
string[] substrings = Regex.Split(infixExp, @"([()+*/-])");
substrings = substrings.Where(s => s != String.Empty).ToArray();

通过这样做,它根据正则数学运算符(+,-,*,/)和括号将字符串的字符分隔成多个部分。完成此操作后,它将消除substrings 中任何剩余的空字符串