質問
文字列の時刻(10.00)と日付と時刻(「21.01.08 10.00」)を一致させたい。次の正規表現を使用しています:
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g");
ただし、これは21.01.08から21.01および10.00に一致します。
PCREを正規表現エンジンとして使用しています。
更新:
申し訳ありませんが、もっと明確にすべきでした。データと時間は、より大きな文字列の一部です。その文字列から時間を抽出したい。
例:
" 10.00から21.01.08に、図書館でパーティーが開催されます" " 21.08.08-10:00にパーティーが開かれます" " 08.08.08に予定されています... ...は10.00から始まる"
これは可能ですか?
解決
"。"で \ b
(単語の境界)が一致するため、元の正規表現は機能しませんでした。 「21.01.08。」境界をより堅牢にコーディングする必要があります。
(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])
これは、日付を除いて、使用した表記のいずれかで時刻をキャプチャします。時間は検証されないことに注意してください。たとえば、「88:99」に一致します。時間の検証は可能ですが、パターンが大幅に複雑になり、ほとんどの状況でやり過ぎになる可能性があります。
非キャプチャグループの代わりに後読みを使用すると便利ですが、PCREは可変幅の後読みをサポートしません。
他のヒント
^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$
時間部分をキャプチャグループに入れてトリックを行う必要があります。
"新しいRegExp"わからない(おそらくJava?)。 Perlでは、次のような値を取得できます...
if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) {
$time_part = $1;
}
.NETでは、次のように動作するはずです...
Regex r = new Regex(@"^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})<*>quot;);
string dateTimeString = "21.01.08 10.00";
if (r.IsMatch(dateTimeString)) {
string timePart = r.Match(dateTimeString).Groups[1].Value;
Console.Write(timePart);
}
Console.ReadKey();
曖昧さの少ないものを使用する場合は、名前付きキャプチャを使用することもできます次に、キャプチャグループへのインデックス。
使用してみる
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}<*>quot; "g");
$は文字列の終わりを示します