([0-9]+)
文字列内の数字を一致させるために標準パターンを使用してきましたが、現在は奇妙なエッジケースがあります。以下を合わせたい。
123
456
.123
123.
%123
31
番目 14 番目
2
番目 100.55
555.10
上記の場合、数字以外の文字は次のとおり
です。
%
s
h
n
d
しかし、彼らはさまざまなキャラクターになる可能性があります。
考え?
JS または PHP が最適です。
([0-9]+)
文字列内の数字を一致させるために標準パターンを使用してきましたが、現在は奇妙なエッジケースがあります。以下を合わせたい。
123
456
.123
123.
%123
31
番目 14 番目
2
番目 100.55
555.10
上記の場合、数字以外の文字は次のとおり
です。
%
s
h
n
d
しかし、彼らはさまざまなキャラクターになる可能性があります。
考え?
JS または PHP が最適です。
あなたが望むものを手に入れるパターンから始めましょう:
\d+
ここで、10進数も一致させたいので、オプションを拡張します。
これは、数値とそれに続くオプションの小数点に一致します
\d+\.?
これは10進数と一致します:
\d*\.\d+
両方を結合すると、確実な番号一致パターンが得られます(のような番号を一致させたくない場合は、これでも問題が発生する可能性があります000.0000
)。
(?:\d+\.?|\d*\.\d+)
ここで注意が必要な部分があります。数字の接頭辞または接尾辞が他にどの文字であるかを正確に判断する必要があります。
例を挙げて、私は次の仮定をします:
%
小数の接頭辞を付けることができますが、接尾辞はありませんst
、、、およびnd
は整数のみの接尾辞を付けることができますrd
th
これらの仮定を考えると:
%
文字はオプションで小数に一致させることができます:
(?:%?(?:\d+\.?|\d*\.\d+))
接尾辞付きの整数は、と一致させることができます(これは接尾辞を検証せず、有効に1nd
なります):
(?:\d+(?:st|nd|rd|th)
これらの2つのパターンを結合すると、次のようになります。
(?:(?:%?(?:\d+\.?|\d*\.\d+))|(?:\d+(?:st|nd|rd|th)))
もちろん、一致を文字列全体に制限することをお勧めします。
/^(?:(?:%?(?:\d+\.?|\d*\.\d+))|(?:\d+(?:st|nd|rd|th)))$/
すべてのケースに対していくつかのルールを作成しようとしました:
(\d+(?:\.\d*)?) // 123 ; 123. ; 123.45
([%.]\d+) // %123 ; .123
(\d+(?:st|nd|th)) // 31st ; 2nd ; 14th
次に混合:
((?:\d+(?:\.\d*)?)|(?:[%.]\d+)|(?:\d+(?:st|nd|th)))
より短いものが必要な場合は([%.\dshnd]+)
、単に を使用できますが、これにより、%%123%%
.
これはあなたのニーズに合っています:
^([.]|%)?\d+(((?<=^1)|(?<!^1)1)st|(?<!^1)((?<=^2)|2)nd|(?<!^1)((?<=^3)|3)rd|th|[.]\d*)?$
^ # start of the string
([.]|%)? # . or % {0 or 1 time}
\d+ # any digit {1 or more times}
(
((?<=^1)|(?<!^1)1)st # either (1) or (ending with 1 but not 11) followed by st
|(?<!^1)((?<=^2)|2)nd # either (2) or (ending with 2 but not 12) followed by nd
|(?<!^1)((?<=^3)|3)rd # either (3) or (ending with 3 but not 13) followed by rd
|th # th
|[.]\d* # . followed by (a digit {0 or more times})
)? # {0 or 1 time}
$ # end of the string
?<=
後読み ( and )をサポートしていないため、JS はこの正規表現を理解できないことに注意してください?<!
。
期待するパターン (日付など) の検証を探している場合は、次のようにすることができます。
[\d.%]*(nd|st|th){0,1}
% の位置が先頭にあることがわかっている場合、または小数が 1 つしかない場合、または小数が必要ない場合は st/nd/etc を次のように絞り込むことができます。
([%]){0,1}[\d]*((((\.[\d]+){0,1}){0,1})|((nd|st|th|rd){0,1}))
私はまだスペースをどこにも扱っていませんが、それをどのように追加できるかわかると思いますか? さらに、1日目と11日目などを確認したい場合があります-検証をさらに改善することを心配している場合は、日付のようなものに進み始めることができます(おそらくもっとうまくグーグルできるでしょう):
([023]){0,1}1st|([02]){0,1}2nd|([02]){0,1}3rd|(11|12|13|30|(([012]){0,1}(([4-9])|0))th)
可能な限り明確にするためにいくつかの余分な括弧があります