2017-05-19 10 views
1

"(number_of_years)y(number_of_months)m(number_of days)d"の形式で文字列の正規表現を書く必要があります。文字列の各部分はオプションであり、1つのスペースで区切る必要があります。私の変種:正規表現* y * m * d

/([0-9]+y\s)?([0-9]+m\s)?([0-9]+d)?/ 

は、文字列の最初または2番目の部分だけを入力する場合にスペースを追加する必要があるため、正しくありません。良い文字列の 例:*y; *m; *y *m

"125y"; "36m"; "8d"; "125y 8d"; "125y 36m"; "36m 8d"; "125y 36m 8d". 

文字列の末尾にスペースを入力させてはなりません。

+0

はあなたが対一致したい文字列のいくつかの例を提供することができますあなたがマッチしたくない文字列?つまり、「25y 10m 29d」=いいですか? "25y 10m 35d" =悪い?すべての部品に「y/m/d」のマークを付ける必要がありますか? –

+0

@RobertTaussig、私は自分の投稿を編集しました。 – MyName

答えて

2

代替バージョンです。項目の間に必要なスペースは、

^(?:(?:\b\ \b|^)?(?:(\d+y)|(\d+m)|(\d+d)))+ 

を必須またはご注文とそれ自身のキャプチャグループに

^(\d+y)?(?:(\b\ \b|^)(\d+m))?(?:(?:\b\ \b|^)(\d+d))?$ 

各項目を必要としないために

+0

最後のバリエーションはすべてのテストにマッチします。どうもありがとう!しかし、この正規表現はjavascriptでは機能しません。私はそれをJavaScriptに変換することに対処できませんでした。親切に私にこれを手伝ってもらえますか? – MyName

+1

@MyName申し訳ありませんが、Javascript用に修正されました。 (Javascriptが条件文をサポートしていないのを忘れてしまった。)囲まれたスペースまたは改行で境界が囲まれているとグループが一致した場合、基本的に置き換えられる – Tezra

+0

あなたは非常に賢い人です。 – MyName

1

一つは使用することができます。

^(?!.*\s$)(\d+y\s)?(\d+m\s)?(\d+d)?$ 

live demo

+0

これは、文字列の最後にスペースを入れることを許します: '* y; * m; * y * m' – MyName

+1

トーマス、それは動作します!どうもありがとう!! – MyName

+0

トーマス、私は '78y7m3d'も有効だが、間違っていることがわかった。 – MyName

0
^([0-9]+y\s?)?(((1[0-2])|([1-9]))m\s?)?((([12]?[0-9])|(3[01]))d)?$ 

私はこれを改善するために百万の方法があると確信しているが、これはせいぜい12ヶ月または31日が存在しないことを強制します。ここで

Examples

+0

なぜ日数と月数を制限していますか?それはOPによって要求されていません。 – Toto

+0

「1y 13m」などのために妥当でないと思われるので、私には、「3.04ドル」ではなく「$ 2.104」を受け入れることに似ています。編集:私はちょうど有効な日付のOPの例に気づいた。私は「36m」は当初はなかったと誓うことができましたが、私は間違っているかもしれません。私は単に私が前提をしていると思っていましたが、許可されていることにOPが明白であったように見えます。 –