【问题标题】:Parsing a string C# (Possibly with Regex)解析字符串 C#(可能使用正则表达式)
【发布时间】:2018-03-31 23:42:30
【问题描述】:

我正在尝试为数学运算解析一行代码。

如:4+18/(9-3)

我希望这些部分是:4、+、18、/、(、9、-、3 和 )。 所以基本上,所有的数字、运算符和括号。

如果我使用带有分隔符的拆分,它会在找到分隔符时删除它。因此,如果我使用我的运算符作为分隔符,那么它们就会被删除。

我尝试使用 Regex.split,它包含运算符,但不是我想要的。它产生类似 4+ 的结果,因为它包括 4 和加号。

这是我一直在尝试的:

        string convert = "4+8/(9-3)";

        string[] parts = Regex.Split(convert, @"(?<=[-+*/])");

【问题讨论】:

  • 可以使用正则表达式解析字符串,但不能使用正则表达式解析语法。最好使用数学表达式解析器/求值器。
  • 但是,无论如何要回答您的问题,([\d\.]+|[()e^/%x*+-]) 应该可以工作。 (example)
  • 如果您打算只使用整数,Regex.Split(convert, @"(\D)");。但它不能作为最终解决方案。
  • 我不确定,但你想要数字和符号分开吗?

标签: c# regex string parsing


【解决方案1】:

根据我的评论,如果您打算使用它来评估数学表达式,则不应使用正则表达式,因为您无法对正在解析的字符串有任何句法或语义理解。

如果您不打算这样做,这应该可以正常工作

([\d\.]+|[()e^/%x*+-])

Regexr example

Dotnetfiddle example

【讨论】:

  • @Aran-Fey 你是对的,从 Regex.Split 更改为 Regex.Matches
  • 这为我添加了一些额外的 "" 空字符串条目,但我只是创建了一个快速循环来删除它们。不确定我是否做错了什么来包含它们,但是一旦删除了空字符串,这很容易,到目前为止我的测试结果是可取的。谢谢。
  • @Birdman 这是因为Regex.Split 的工作原理,如果您查看我使用Regex.Matches 的Dotnetfiddle 示例并循环遍历它返回的匹配项。
【解决方案2】:

好吧,我想这个问题可以在下面的正则表达式的帮助下解决。

[-+*/\(\)]|\d+

【讨论】:

  • 不。这会将数字拆分为单个数字。
  • 不。现在它复制了每个字符。即使您将该捕获组更改为非捕获组,它仍然会将数字拆分为个位数。请测试您的正则表达式;这越来越傻了。
  • “它仍然会将数字拆分为个位数” - @Aran,怎么样?
  • 好吧,因为在后视中使用\d\d+ 并不重要。正则表达式通过第一个数字后,lookbehind 看到一个数字并将该数字分成两个,+ 或不。
  • @Aran 我没有想到后视,但现在我实际上不确定为什么 op 全部使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2019-12-10
  • 2010-11-22
相关资源
最近更新 更多