0

私には表現があります

^(((\d{1,2}))|((\d{1,2}\.\d{1,2}))|((\d{1,2}\.\d{1,2}\.\d{1,2})))(;?)$

次のようなテキスト行を検証するには:

9
99
99.9
99.99
99.99.9
99.99.99

;次に、 -separatedtextのこれらすべての可能なバリアントを検証する必要があります

式を使用する場合:

^(((((\d{1,2}))|((\d{1,2}\.\d{1,2}))|((\d{1,2}\.\d{1,2}\.\d{1,2})))(;?))+?)$

それは貪欲になり、2桁以上を許可します。

申し訳ありませんが、説明を追加する必要があります。これはすべての可能な一致の例です

9;99;99.9;99.99;99.99.9;99.99.99
4

5 に答える 5

2

この正規表現を使用する^\d{1,2}(\.|;\d{1,2})*$

また

繰り返し回数を設定する^\d{1,2}(\.|;\d{1,2}){0,2}$

于 2013-01-11T12:58:23.383 に答える
1

問題のある正規表現では、最初のオプションである2桁を超える数字が許可されます。

((\d{1,2}))

最後にaが続くと、+任意の桁数に効果的に一致します。

于 2013-01-11T13:04:40.793 に答える
1

多分私は間違っていますが、あなたはこのようなものが必要です:

^((\d)\2?)(?:[.](?:\1|\2))*$

あなたが望むものに変更*してください:){0,2}あなたのパターンに一致するようにまたは何か他のもの。

私はここで何をしますか?

私はただ使用します\2 \1-それはすでに正規表現で一致しているグループです:)

99.99.99

\1は外側のブラケットなので、最初に一致します99=^( (\d)\2? )...

\2は内側の括弧なので、一致します9 = ( \d )\2?

于 2013-01-11T13:07:34.203 に答える
1

あなたはで試すことができます:

^(\d{1,2})(;(\d{1,2})){0,2}$

;区切り文字で記述された入力を受け入れます。

.セパレータをテストする場合は、次のように変更;して\.ください。

^(\d{1,2})(\.(\d{1,2})){0,2}$
于 2013-01-11T12:55:20.783 に答える
1

問題の原因は貪欲なマッチングではなく、オプションでセミコロンの区切りのみを許可しているという事実です。私は次のようなものを試してみます(dotted_number元の単一の値に一致する正規表現であり、セミコロンはありません)

^(dotted_number;)*dotted_number;?$

結局、それは次のようになります

^((\d{1,2}\.){0,2}(\d{1,2});)*(\d{1,2}\.){0,2}(\d{1,2});?$

または、逆にそれを理解することもできますが、これは少し速いかもしれません

^dotted_number(;dotted_number)*;?$

これでも機能します:

egrep '^(([[:digit:]]{1,2}\.){0,2}[[:digit:]]{1,2}(;|;?$))+$'
于 2013-01-11T13:02:09.800 に答える