gpt4 book ai didi

C#正则表达式麻烦

转载 作者:行者123 更新时间:2023-11-30 15:05:36 33 4
gpt4 key购买 nike

问题!

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

  • 输入可以是自然数(小于 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

有问题吗?

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

目标文件

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

OOR_Quantity

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 ...
}
}

最佳答案

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

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

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

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

关于C#正则表达式麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8903780/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com