私は次の値を受け入れる正規表現を作成しようとしています:
- (ブランク)
- 0
- 00
- 00.0
- 00.00
私は思いついた ([0-9]){0,2}.([0-9]){0,2}
私には「0から9までの数字0〜2回発生し、続いて "。"文字(オプションである必要があります)、0〜9の数字の後に0〜2回発生します。 2桁の数字だけが入力された場合、 "。"必要ない。この正規表現に何が間違っていますか?
回答:
回答№1の15あなたはドットをオプションにしませんでした:
[0-9]{0,2}(.[0-9]{1,2})?
回答№2の場合は3
最初に、 {0-2}
すべきである {0,2}
それが最初の例であったように。
第2に、繰り返しセクションもグループ化する必要があります。
第3に、最後の部分全体をオプションにする必要があります。もしドットがあるなら、それの後に何かがなければならないので、2番目の繰り返しのものを {1,2}
.
([0-9]{0,2})(.([0-9]{1,2}))?
答え№3の2
あなたの正規表現にはいくつかの問題があります:
- ドットは特殊文字であり、ワイルドカードとして機能します。リテラルドットが必要な場合は、それをエスケープする必要があります(
.
)。 - たとえあなたがドットをワイルドカード、あなたの正規表現は "0"のような文字列に一致します。正規表現エンジンには、それに続く数字がある場合にのみドットにマッチするように指定していないからです。
- あなたの表現が 固定されたたとえば、別の単語の中にパターンを含む文字列と一致することがあります(つまり、ab12が一致します)。
より良いパターンは、次のようなものになります。
/b[0-9]{0,2}(?:.[0-9]{1,2})?b/
ご了承ください (?:...)
グループが逆参照を作成しないようにします。これはおそらくあなたのケースでは必要ではありません。
回答№4の場合は1
Perlで説明されている1つの方法は、 のみ あなたが列挙した文字列。 重要な部分は、空の文字列を一致させる方法です。すべてのパターン要素をオプションにするわけではなく、ほぼすべての文字列を一致させるという望ましくない効果を持つ戦略です。
use warnings;
use strict;
my @data = (
"",
"0",
"00",
"00.0",
"00.00",
"foo", # Should not match.
".0", # Should not match.
);
for (@data){
print $_, "n" if /^$|^[0-9]{1,2}(.[0-9]{1,2})?$/;
}
回答№5の場合は0
上記の例のほとんどは、最初の部分を固定しません ^
終了 $
データの
私は次のいずれかでそれを解決します:
^[[:digit:]]{0,2}([.][[:digit:]]{1,2})$
^d{0,2}([.]d{1,2})$
^[0-9]{0,2}([.][0-9]{1,2})$
読みやすくするために、私は一般的に [.]
に .
のようなPOSIXクラスの使用 [[:digit:]]
.