6

Javaの正規表現について質問がありますが、これは他の言語にも当てはまると思います。

ユーザーが。のようなものを入力できるフィールドから時間を解析するための正規表現があります4d 8h 42m15hもちろん、ユーザーがすべての数字を入力する必要がないように(たとえば、単なる数字を入力する必要がないように)、できるだけ柔軟にしたいと思います。

私の正規表現は、その点に関して非常に満足のいくものです。(?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?

今の私の問題は、少なくとも1つの時間単位が満たされていることを確認したいのですが、空の文字列にも一致することです。

現在の解決策は、それらの1つを任意に選択して必須にすることですが、必須フィールドは避けようとしているものであるため、私はそれに満足していません。

また、またはを作成することは、後で正規表現を解析するときにグループをテストする必要があるため、group(1)に数日間、group(2)に数時間アクセスするのではなく、...(これは私が思うことですまたはについて話すときの: 、必須の日数または必須の時間または必須の分(?:([\d]+)d[\s]*(?:([\d]+)h)?[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*([\d]+)h[\s]*(?:([\d]+)m)?|(?:([\d]+)d)?[\s]*(?:([\d]+)h)?[\s]*([\d]+)m)として理解されます)。

では、正規表現を変更して、キャプチャしていないグループの少なくとも1つが、数日、数時間、数分であっても空にならないようにするにはどうすればよいでしょうか。

4

2 に答える 2

6

d hルックフォワードアサーションを使用して、またはの少なくとも1つが表示されるようにすることができmます。

(?=.*[mhd])(?:(\d+)d)?\s*(?:(\d+)h)?\s*(?:(\d+)m)?
于 2012-11-20T07:13:52.327 に答える
2

OmnipotentEntityが提案したように、前向きな先読みを使用して、番号の後に、、またはが続くかどうかを判断dできmますh

それを書く別の方法は次のようになります。

(\d+(?=[dhm])[dhm]\s*){1,3}

これは次のように一致します。

4d 8h 42m
3d
15h
28m
12d 24m
2h 55m
7d  11h  24m
5d2h5m
于 2012-11-20T08:13:23.750 に答える