繁体   English   中英

C#正则表达式麻烦

[英]C# regular expression trouble

问题!

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

  • 输入可能是一个自然数(低于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来解析文件,有没有其他方法可以解决这个问题。 Actualy我正在尝试实现自定义转换器。

对象文件

[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

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

text1 = "\"10,000\""
text2 = "50"

regex = /"?([0-9]+(?:,[0-9]+){0,})"?/

text1 =~ regex
puts "#$1"

text2 =~ regex
puts "#$1"

结果是:

10,000
50

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM