我正在尝试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}
似乎正在从中缀表达式中正确删除空格,但拆分生成的字符串是不合适的。
有谁能让我了解原因?同样,如果您有任何建设性的批评或建议,请告诉我!
答案 0 :(得分:4)
如果匹配位于字符串的一端,则会在其旁边显示空匹配。同样,如果有两个相邻的匹配,则字符串将在它们两个上分开,因此最终会在它们之间留下一个空字符串。引用MSDN:
如果多个匹配彼此相邻,则会在数组中插入空字符串。例如,在单个连字符上拆分字符串会导致返回的数组在找到两个相邻连字符的位置包含空字符串。[/ p>
和
如果在输入字符串的开头或结尾处找到匹配项,则在返回的数组的开头或结尾处包含空字符串。
只需在第二步中过滤掉它们。
此外,请让您的生活更轻松,并使用逐字字符串:
infixExp = Regex.Replace(infixExp, @"\s+", string.Empty);
string[] substrings = Regex.Split(infixExp, @"(\(|\)|-|\+|\*|/)");
第二个表达式可以进一步简化:
@"([()+*/-])"
答案 1 :(得分:1)
请丢弃正则表达式。有更好的工具可供使用。您可以使用String.Trim()
,.TrimEnd()
和.TrimStart()
。
string inputString = " asdf ";
string output = inputString.Trim();
对于字符串中的空格,请使用String.Replace
。
string output2 = output.Replace(" ", "");
您必须将此扩展为其他空格字符。
答案 2 :(得分:1)
var result = Regex.Split(input, "(\\d+|\\D)")
.Where(x=>x!="").ToArray();
答案 3 :(得分:1)
m.buettner's answer是正确的。还要考虑您可以一步完成此操作。来自MSDN:
如果在Regex.Split表达式中使用捕获括号,则为any 捕获的文本包含在结果字符串数组中。
因此,如果在分割模式中包含空白但在捕获括号外部,则可以在其上拆分但不包括在结果数组中:
var substrings = Regex.Split("(2 + 3) * 7", @"([()+*/-])|\s+");
结果:
substrings = {"", ( , 2, "", +, "", 3, ), "", "", *, "", 7}
你的最终结果将是:
substrings.Where(s => s != String.Empty)
答案 4 :(得分:0)
为什么不删除空格然后用正常的字符串处理函数拆分字符串?像这样......
string x = "(2 + 3) * 4";
x = x.Replace(" ", "").Replace("\t",""); //etc...
char[] y = x.ToCharArray();
为什么要让它变得比它需要的更复杂?
答案 5 :(得分:0)
非正则表达式解决方案可能是String.Replace - 你只需用空字符串“”替换“”,“\ t”和其他空格。
答案 6 :(得分: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();
通过这样做,它可以根据常规数学运算符(+, - ,*,/)和括号将String的字符分成几部分。执行此操作后,它会消除substrings