正規表現で以下のようなパターンを実装しました。
C#
1var reg = new Regex(@"^(?:([0-9]*),)*([0-9]*)$");
カンマで区切られた整数をキャプチャするのが目的です。ところが、
C#
1var m = reg.Match("12,345,6,123,4");
とすると、m.Groupsは
C#
1m.Groups = {"12,345,6,123,4", "123", "4"};
となってしまいます。最後に合致した部分しかキャプチャされていないようです。想定していた動作は、
C#
1m.Groups = {"12,345,6,123,4", "12", "345", "6", "123", "4"};
です。量指定子"*"によって丸括弧"()"によるキャプチャも繰り返して欲しいです。
こういうことは正規表現ではできないのでしょうか。
もちろん、この場合に限ればSplitで事足りますが、実際にやりたいのはもう少し複雑なので、できれば正規表現で実現してしまいたいです。
[追記]
例が簡単すぎたのでもう少し複雑にします(やりたいことに近づけます)。
C#
1var reg = new Regex(@"^(?:((?:\([0-9]+,[0-9]+\))+),)*((?:\([0-9]+,[0-9]+\))+)$"); 2var m = reg.Match("(1,23)(45,6),(3,5),(7,9)");
この結果がこうなって欲しいです。
C#
1//m.Groups = {"(1,23)(45,6),(3,5),(7,9)", "(1,23)(45,6)", "(3,5)", "(7,9)"}; // こうなってほしい 2m.Groups = {"(1,23)(45,6),(3,5),(7,9)", "(3,5)", "(7,9)"}; // こうなってしまう
区切り文字自体は単純(カンマ等)なのですが、区切られている要素にも区切り文字が入ってしまっているので、単純なSplitではできないように思います(区切り文字とみなすかどうかが文脈に依存する)。
現状は自分で括弧の対応を解析して要素の区切りかどうかを識別していますが、これを正規表現だけで実現したいです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/14 14:38
2017/06/14 15:01