【问题标题】:How do I properly extract a number that starts and ends with the same number如何正确提取以相同数字开头和结尾的数字
【发布时间】:2020-09-05 23:11:04
【问题描述】:

我正在尝试学习如何从字符串中提取所有数字,其中数字以 0 到 9 之间的随机数字开头,然后以相同的数字结尾,但如果在出现下一个字母,它也应该包括那个。

让我给你看一个例子。 以这个字符串为例 12346171par827here727next8number5052car 然后我的程序将提取12346171727505

到目前为止,我所拥有的是这个,它显然没有做它应该做的事情,但我想不出一个好的算法。

如何正确提取数字?

string input = "12346171par827here727next8number5052car";

var charArray = input.ToArray();
int pos = 0;

var firstNum = 0;
var secondNum = 0;

for (int i = 0; i < charArray.Length; i++)
{
    if (char.IsDigit(charArray[i]))
    {
        firstNum = charArray[i];

        for (int j = i; j < charArray.Length; j++)
        {
            if (char.IsDigit(charArray[j]) && charArray[j] == firstNum)
            {
                secondNum = charArray[j];
            }
        }

    }
}

【问题讨论】:

  • 我不确定我是否理解这里的输出,为什么结果不包括123461171。这是一个错误,还是您想要的实际行为?

标签: c# .net algorithm


【解决方案1】:

一个简单的方法是使用Regular Expressions。您可以使用以下正则表达式模式:

([0-9])[0-9]*\1

Demo.

详情:

([0-9])    # Matches a single digit and put it in group #1.
[0-9]*     # Matches zero or more digits.
\1         # Matches the same string that was captured in group #1.

这是一个完整的例子:

string input = "12346171par827here727next8number5052car";

string pattern = @"([0-9])[0-9]*\1";
var matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
    Console.WriteLine(match.Value);
}

输出:

12346171
727
505

请注意,上面的模式将匹配“6505”中的“505”。如果您想通过确保重复数字位于数字的开头来防止这种情况,您可以使用负数Lookbehind。在这种情况下,模式将是:

(?<![0-9])([0-9])[0-9]*\1

Demo.

【讨论】:

    【解决方案2】:

    假设您的规则定义正确。您可以使用老式的 for 循环

    相当有效地做到这一点 O(n)

    给定

    public static IEnumerable<string> Get(string input)
    {
        int last = -1, first = -1;
        for (var index = 0; index < input.Length; index++)
            if (!char.IsDigit(input[index]))
            {
                if (last > 1)
                    yield return input.Substring(first, last - first + 1);
                first = last = -1;
            }
            else if (first == -1)
                first = index;
            else if (input[first] == input[index])
                last = index;
        if (last > 1)
            yield return input.Substring(first, last - first + 1);
    }
    

    用法

    var input = "12346171par827here727next8number5052car";
    Console.WriteLine(string.Join(", ", Get(input)));
    

    输出

    12346171, 727, 505
    

    Full Demo Here

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2016-02-19
      • 2021-11-28
      • 2014-08-18
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多