0

私はこのような文字列とこのような文字列を持ってい600/-4.412/11ます600/11

[optional sign][float or integer]/[optional sign][float or integer]/[optional sign][float or integer]
[optional sign][float or integer]/[optional sign][float or integer]

例:

1) 600/-4.412/11
2) 600/11

そして、1 に一致する正規表現と 2 に一致する正規表現を見つける必要があります。ただし、両方の式が他方を選択/一致してはなりません。私の謙虚な正規表現の知識で、私はこの式を構築することができました:

([-+]?[0-9]+(\.?[0-9]+)?\/?){3}

この式の問題は、 http: //gskinner.com/RegExr/によると、1) と 2) に一致することです。{3} を {2} に変更して別のマッチングを取得するだけでよいと思っていたので、誰かがこれを修正するか、少なくともこれが起こっている理由を教えてくれることを願っています。

4

2 に答える 2

1

問題

問題は、正規表現がサブパターンの繰り返しを許可することです。つまり[-+]?[0-9]+(\.?[0-9]+)?\/?、 で区切られた数字の各セクションに制限せずに一致させ/ます。

質問のこの例では600/11、最初の繰り返しは に一致600/し、2 番目は に1なり、3 番目は最後の になり1ます。

解決策 1

間違った試み

validationの場合は、少し変更して、必要に応じて機能させることができます。

^([-+]?[0-9]+(\.[0-9]+)?(?:/|$)){3}$

(?:/|$)数値 (浮動小数点または整数) を強制的に で終了させる/か、文字列の末尾にします。これにより、各繰り返しが同じ数内で一致しないことが効果的に確認されます。

^$文字列に正確に 3 つの数字があることを確認するために、前後に が追加されます。

取り消し線が引かれていないテキストは、正しいソリューションに適用されます。

正しい解決策

ただし、上記の正規表現はWRONGです。1/2/3/一致する(で終わる)などの無効な入力は引き続き許可されます/。上記のケースが一致しないように、最後に追加のアサーションを追加する必要があります。

^([-+]?[0-9]+(\.[0-9]+)?(?:/|$)){3}(?<!/)$

(?<!/)文字列の末尾の前の文字が/.

解決策 2

[number]([delimiter][number]){repeat}そのような場合、フォームをいじるよりも、フォームに正規表現を書く方がバグが少なくなり([number][delimiter/ending]){repeat}ます。

以下の回答は、入力を厳密に検証します。

^[-+]?[0-9]+(\.[0-9]+)?(?:/[-+]?[0-9]+(\.[0-9]+)?){2}$

上記は、ちょうど 3 つの数字のケースを一致させるためのものです。2に変更1(または を削除{2}) して、正確に 2 つの数字に一致させます。

于 2013-04-25T10:12:14.280 に答える
1

これは、式のほとんどすべてがオプションになっているために発生します。表示する必要があるのは 1 桁の数字のみであるため、式も と一致し007ます。

解決策は、式の一部を必須にすることです。これにアプローチする方法はたくさんあります。あなたの説明に正確には適合しませんが、それでも考慮すべきIMHOは次のとおりです

([-+]?[0-9]+(\.[0-9]+)?(?=/|$))

この式は両方のタイプの入力に一致しますが、一致数 (2 または 3) を見るだけでそれらを区別できます。これは、分岐する前に 2 つの異なる式をテストすることと同じです。

アップデート:

上記の式は、入力の開始と終了に固定されていないため、自由すぎます。これは固定されているため、入力に偽の文字が含まれている場合は一致しません。

^([-+]?[0-9]+(\.[0-9]+)?(/(?!$)|$)){2,3}$

それを分解する:

^                   start matching at the beginning
(                   match the following:
[-+]?                   optional sign
[0-9]+(\.[0-9]+)?       integer or float
(                       either
/(?!$)                      a slash that's not trailing
|                       or
$                           end of input
)                   
){2,3}              do this exactly two or three times
$                   and make sure there is no other input
于 2013-04-25T10:08:45.510 に答える