C#正则表达式出现问题

本文关键字:问题 正则表达式 | 更新日期: 2023-09-27 18:20:49

问题

我有以下来自平面文件的输入(规则)(谈论数字输入):

  • 输入可能是一个自然数(低于1000):1, 10, 100, 999, ...
  • 输入可能是一个逗号分隔的数字,周围有引号(1000以上):"1,000", "2,000", "3,000", "10,000", ...

我有以下正则表达式来验证输入:(?:('d+)|'x22([0-9]+(?:,[0-9]+)*)'x22),所以对于像10这样的输入,我期望在第一个匹配组10中,这正是我得到的。但是,当我得到像"10,000"这样的输入时,我期望它在第一个匹配组10,000中,但它存储在第二个匹配组中。

示例

string text1 = "'"" + "10,000" + "'"";
string text2 = "50";
string pattern = @"('d+)|'x22([0-9]+(?:,[0-9]+){0,})'x22";
Match match1 = Regex.Match(text1, pattern);
Match match2 = Regex.Match(text2, pattern);
if (match1.Success)
{
    Console.WriteLine("Match#1 Group#1: " + match1.Groups[1].Value);
    Console.WriteLine("Match#1 Group#2: " + match1.Groups[2].Value);
    # Outputs
    # Match#1 Group#1: 
    # Match#1 Group#2: 10,000
}
if (match2.Success)
{
    Console.WriteLine("Match#2 Group#1: " + match2.Groups[1].Value);
    Console.WriteLine("Match#2 Group#2: " + match2.Groups[2].Value);
    # Outputs
    # Match#2 Group#1: 50
    # Match#2 Group#2: 
}

预期结果

同一匹配组上的两个结果,在本例中为1

问题

  • 我做错了什么?我只是从正则表达式匹配中得到了不好的分组
  • 另外,我正在使用filehelper.NET来解析该文件,有没有其他方法可以解决这个问题。实际上,我正在尝试实现一个自定义转换器

对象文件

[FieldConverter(typeof(OOR_Quantity))]
public Int32 Quantity;

OOR_数量

internal class OOR_Quantity : ConverterBase
{
    public override object StringToField(string from)
    {
        string pattern = @"(?:('d+)|'x22([0-9]+(?:,[0-9]+)*)'x22)";
        Regex regex = new Regex(pattern);
        if (regex.IsMatch(from))
        {
            Match match = regex.Match(from);
            return int.Parse(match.Groups[1].Value);
        }
        throw new ...
    }
}

C#正则表达式出现问题

组号的分配完全基于它们在正则表达式中的位置,特别是左括号(的相对位置。在正则表达式中,('d+)是第一组,([0-9]+(?:,[0-9]+)*)是第二组。

如果您想用相同的标识符来引用它们,请使用命名组,并为它们提供相同的名称:

@"(?:(?<NUMBER>'d+)|'x22(?<NUMBER>[0-9]+(?:,[0-9]+)*)'x22)"

现在,您可以将捕获的值检索为match.Groups["NUMBER"].Value

我用Ruby测试了下面的正则表达式:

text1 = "'"10,000'""
text2 = "50"
regex = /"?([0-9]+(?:,[0-9]+){0,})"?/
text1 =~ regex
puts "#$1"
text2 =~ regex
puts "#$1"

结果是:

10,000
50

我认为你可以用C#重写。这对你来说还不够吗?