3

問題!

フラットファイルから次の入力(ルール)があります(数値入力について):

  • 入力は自然数 (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、それは 2 番目に一致するグループに格納されます。

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_数量

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

2 に答える 2

5

グループ番号は、純粋に正規表現での位置に基づいて割り当てられます。具体的には、左ブラケットの相対位置です(。あなたの正規表現で(\d+)は、が最初のグループで、([0-9]+(?:,[0-9]+)*)が 2 番目のグループです。

両方を同じ識別子で参照したい場合は、名前付きグループを使用して、両方に同じ名前を付けます。

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

これで、キャプチャされた値を として取得できますmatch.Groups["NUMBER"].Value

于 2012-01-18T01:07:30.663 に答える
0

以下の正規表現を Ruby でテストしました。

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

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

text1 =~ regex
puts "#$1"

text2 =~ regex
puts "#$1"

結果は次のとおりです。

10,000
50

C#で書き直せると思います。それはあなたにとって十分ではありませんか?

于 2012-01-18T01:35:57.290 に答える