0

我正在尝试将remove white space其存在于String input. 我的最终目标是创建一个中缀评估器,但我在解析输入表达式时遇到问题。

在我看来,解决这个问题的简单方法是使用一个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}

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

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

4

7 回答 7

4

如果匹配项位于字符串的一端,您将在其旁边获得一个空匹配项。同样,如果有两个相邻的匹配项,则字符串将在这两个匹配项上拆分,因此您最终会得到一个空字符串。引用MSDN

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

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

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

另外,请让您的生活更轻松并使用逐字字符串:

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

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

@"([()+*/-])"
于 2013-08-28T17:16:17.270 回答
1

请抛弃正则表达式。有更好的工具可以使用。您可以使用String.Trim().TrimEnd().TrimStart()

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

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

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

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

于 2013-08-28T17:17:37.703 回答
1
var result = Regex.Split(input, "(\\d+|\\D)")
              .Where(x=>x!="").ToArray();
于 2013-08-28T17:19:43.950 回答
1

m.buettner 的回答是正确的。还要考虑您可以一步完成。来自MSDN

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

因此,如果您在拆分模式中包含空格但在捕获括号之外,您也可以在其上拆分但不将其包含在结果数组中:

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

结果:

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

您的最终结果将是:

substrings.Where(s => s != String.Empty)
于 2013-08-28T17:49:36.733 回答
0

为什么不直接删除空格,然后使用普通字符串处理函数拆分字符串?像这样...

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

为什么要让这比它需要的更复杂呢?

于 2013-08-28T17:17:59.183 回答
0

非正则表达式解决方案可能是String.Replace - 您可以简单地将“”、“\t”和其他空格替换为空字符串“”。

于 2013-08-28T17:18:08.020 回答
0

感谢您的所有回复,我找到了我正在寻找的解决方案。

// 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

于 2013-08-28T21:45:44.537 回答