【问题标题】:Regular expression help - sum the numbers in a string?正则表达式帮助 - 对字符串中的数字求和?
【发布时间】:2010-07-09 20:30:59
【问题描述】:

不确定这是否是最好的方法,但我有一些字符串表示某些块的方向。例如,“3V6V”表示一行 3 个垂直块,以及一行 6 个垂直块。 '3V6V6V' 表示 3、6、6 行全部垂直。 '4H4H4H4H' 将是 4 行,每行 4 个水平块。即每2个字符构成一行。每个项目要么只有水平,要么只有垂直,没有混合和匹配。我需要在这里做的是添加数字的总和来确定块的总数。我怎样才能做到这一点?我正在考虑做某种 string.split() 然后如果数组项是数字,则将其添加到运行总数中。有更好的方法吗? “4H4H4H4H”是 16,“3V6V6V”是 15。有人能指出我正确的方向吗?必须有一个相当简单的方法来做到这一点。

谢谢,
~ck 在圣地亚哥

【问题讨论】:

  • 这个问题让我想起了那句经典格言:Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.
  • ... 这让 想起以下引用:'有些人在遇到正则表达式时,会想“我知道,我会使用我记得的朗朗上口的名言”。现在他们没有在讨论中添加任何内容。' -- Tomalak
  • "每 2 个字符构成一行" 所以行永远不能有 10 个或更多块?

标签: c# .net regex parsing string


【解决方案1】:
int sum = Regex.Split(input, "[HV]")
                .Where(s => !string.IsNullOrEmpty(s))
                .Select(s => int.Parse(s))
                .Sum();

请注意,这将接受格式错误的输入,例如“3H3”或“3H6V”

编辑:事实上你可以用 String.Split 来简化它:

int sum = input.Split(new[] { 'H', 'V' }, StringSplitOptions.RemoveEmptyEntries)
    .Sum(str => int.Parse(str));

【讨论】:

    【解决方案2】:

    我将使用(未经测试)的 RegExp 是:

    ((\d+)(?<type>[HV]))((\d+)\k<type>)*
    

    通过 \k 确保字符串中只有 Hs 或 Vs,但不混合。返回值可能是一个数组,这样你就可以很容易地把数字相加。

    【讨论】:

    • 我无法让它工作。 Visual Studio 对错误的编译常量大喊大叫。我选择了 Lee 的解决方案,效果很好。谢谢你。 ~ck
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多