0

我想在 C# 中构建正则表达式。我需要知道如何使用 Regex 提取 alpha 和计数数字。

string example = "ASDFG 3457";

需要拔出“ASDFG”,然后数数(例如 4 或 5 - 7)。如果找到 4 位数字,则返回值 = 3457,不带 alpha。如何在 C# 中做到这一点?
我知道最好不要使用正则表达式,但我有一个要求,我必须出于某种原因使用正则表达式。

4

4 回答 4

2

如果你所做的只是试图从一段文本中获取数字,你可以这样做:

         string expr=@"\d+";
         string text="ASDFG 3457":         
         MatchCollection mc = Regex.Matches(text, expr);
         foreach (Match m in mc)
         {
            Console.WriteLine(m);
         }
于 2013-07-23T10:20:31.917 回答
1

正则表达式

(?<alpha>\w*) (?<number>\d*)

这会提取两个命名组:alpha 和 number。它假定第一组仅包含单词,第二组仅包含数字,并且它们由空格分隔。它们都不是强制性的。

如果您需要强制它们,您可以替换*+ 您也可以将位数强制为四位\d{4}

我建议您阅读正则表达式教程并从网上获取一些 c# 示例。@Srb1313711 的答案已经可以帮助您。

于 2013-07-23T10:29:22.997 回答
1

显然(咳嗽)最简单的“解决方案”在这里:

using System;
using System.Collections.Generic;

class Program
{
    private static IEnumerable<long> ParseNumbers(IEnumerable<char> stream)
    {
        bool eos = false;

        using (var it = stream.GetEnumerator())
            do
            {
                Func<bool> advance = () => !(eos = !it.MoveNext());

                while (advance() && !char.IsDigit(it.Current)) ;

                if (eos) break;

                long accum = 0;
                do accum = accum * 10 + (it.Current - '0');
                while (advance() && char.IsDigit(it.Current));

                yield return accum;
            }
            while (!eos);
    }

    static void Main()
    {
        foreach (var num in ParseNumbers("ASDFG 3457 ASDFG.\n 123457"))
        {
            Console.WriteLine(num);
        }
    }
}

当然是为了好玩。

编辑

更多乐趣:unsafe变化。请注意,这也不再是延迟的,因此如果不是所有输入都已到达,它将无法工作,并且它会生成一个急切的值列表:

using System;
using System.Collections.Generic;

class Program
{
    private static unsafe List<long> ParseNumbers(char[] input)
    {
        var r = new List<long>();

        fixed (char* begin = input)
        {
            char* it = begin, end = begin + input.Length;

            while (true)
            {
                while (it != end && (*it < '0' || *it > '9')) 
                    ++it;

                if (it == end) break;

                long accum = 0;
                while (it != end && *it >= '0' && *it <= '9') 
                    accum = accum * 10 + (*(it++) - '0');

                r.Add(accum);
            }
        }

        return r;
    }

    static void Main()
    {
        foreach (var number in ParseNumbers("ASDFG 3457 ASDFG.\n 123457".ToCharArray()))
        {
            Console.WriteLine(number);
        }
    }
}
于 2013-07-23T10:42:57.130 回答
0

描述

这个正则表达式将:

  • 将文本捕获到第 1 组
  • 计算位数并根据找到的位数将它们放入捕获组
    • 捕获组 2 的数字长度为 8 位或更多位
    • 捕获组 3 将具有 5-7 位长的数字
    • 捕获组 4 将具有正好 4 位数长的数字
    • 捕获组 5 将具有 1-3 位长的数字

([A-Za-z]*) (?:(\d{8,})|(\d{5,7})|(\d{4})|(\d{1,3}))

在此处输入图像描述

例子

现场演示:http ://www.rubular.com/r/AIO9uUNNQc

示例文本

ASDFG 1234567890
ASDFG 123456789
ASDFG 12345678
ASDFG 1234567
ASDFG 123456
ASDFG 12345
ASDFG 1234
ASDFG 123
ASDFG 12
ASDFG 1

捕获组

[0][0] = ASDFG 1234567890
[0][1] = ASDFG
[0][2] = 1234567890
[0][3] = 
[0][4] = 
[0][5] = 

[1][0] = ASDFG 123456789
[1][1] = ASDFG
[1][2] = 123456789
[1][3] = 
[1][4] = 
[1][5] = 

[2][0] = ASDFG 12345678
[2][1] = ASDFG
[2][2] = 12345678
[2][3] = 
[2][4] = 
[2][5] = 

[3][0] = ASDFG 1234567
[3][1] = ASDFG
[3][2] = 
[3][3] = 1234567
[3][4] = 
[3][5] = 
[4][0] = ASDFG 123456
[4][1] = ASDFG
[4][2] = 
[4][3] = 123456
[4][4] = 
[4][5] = 

[5][0] = ASDFG 12345
[5][1] = ASDFG
[5][2] = 
[5][3] = 12345
[5][4] = 
[5][5] = 

[6][0] = ASDFG 1234
[6][1] = ASDFG
[6][2] = 
[6][3] = 
[6][4] = 1234
[6][5] = 

[7][0] = ASDFG 123
[7][1] = ASDFG
[7][2] = 
[7][3] = 
[7][4] = 
[7][5] = 123
[8][0] = ASDFG 12
[8][1] = ASDFG
[8][2] = 
[8][3] = 
[8][4] = 
[8][5] = 12

[9][0] = ASDFG 1
[9][1] = ASDFG
[9][2] = 
[9][3] = 
[9][4] = 
[9][5] = 1
于 2013-07-23T12:55:34.707 回答