0
Regex regOrg = new Regex(@"org(?:aniser)?\s+(\d\d):(\d\d)\s?(\d\d)?\.?(\d\d)?", RegexOptions.IgnoreCase);
MatchCollection mcOrg = regOrg.Matches(str);
Match mvOrg = regOrg.Match(str);

dayOrg = mvOrg.Value[4].ToString();
monthOrg = mvOrg.Value[5].ToString();
hourOrg = mvOrg.Value[2].ToString();
minuteOrg = mvOrg.Value[3].ToString();

この正規表現は、文字列をテキストで分析します

"organiser 23:59" / "organiser 25:59 31.12" 

また

"org 23:59" / "org 23:59 31.12"

オプションのパラメーターの日と月 したがって、出力変数 dayOrg、monthOrg、hourOrg、minuteOrg をこのデータで確認したいのですが、次のようになります。

Query: org 23:59 31.12
The value mcOrg.Count: 1
The value dayOrg: 2
The value monthOrg: 3
The value hourOrg: g
The value minuteOrg: empty

私は何を間違っていますか?多くのオプションを試しましたが、うまくいきません。

4

3 に答える 3

2

グループに正しくアクセスしていません (一致した文字列の個々の文字にアクセスしています)。

dayOrg = mvOrg.Groups[4].Value;
monthOrg = mvOrg.Groups[5].Value;
hourOrg = mvOrg.Groups[2].Value;
minuteOrg = mvOrg.Groups[3].Value;
于 2013-05-26T12:18:30.653 に答える
1

その結果が得られる理由は、mvOrg Match から Value[index] を取得しているためです。

MSDNで説明されているように、Match クラスはValue が最初に一致することを示しているため、グループではなく最初に一致した文字配列にアクセスしています。見つかった実際のグループを取得するには、Match クラスの Groups プロパティを使用する必要があります。

オプションのパラメーターにアクセスする前に、このコレクションの数を確認してください。

于 2013-05-26T12:20:28.120 に答える
0

パターンの名前を追加したので、次のようになります。

            Regex regOrg = new Regex(@"org(?:aniser)?\s+(?<hourOrg>\d{2}):(?<minuteOrg>\d{2})\s?(?<dayOrg>\d{2})?\.?(?<monthOrg>\d{2})?", RegexOptions.IgnoreCase);

このように結果にアクセスできます

        Console.WriteLine(mvOrg.Groups["hourOrg"]);
        Console.WriteLine(mvOrg.Groups["minuteOrg"]);
        Console.WriteLine(mvOrg.Groups["dayOrg"]);
        Console.WriteLine(mvOrg.Groups["monthOrg"]);

正規表現を変更でき、すべてのインデックスを変更する必要があるため、ハードコードされたインデックスを使用することはお勧めできません
... それはあなたが望んでいたものですか?

于 2013-05-26T12:26:40.907 に答える