Iは1から50包括的に任意の数と一致します正規表現を探しています。これまでのところ、私は例を発見したが、彼らはすべての文字列が、私にはしたくない小数点を含むことができます。だから1,13,24,50はOKですが、1.などはそうではありません。私は使用できるREGEXPはありますか?事前に正規表現
おかげで、 ティム
Iは1から50包括的に任意の数と一致します正規表現を探しています。これまでのところ、私は例を発見したが、彼らはすべての文字列が、私にはしたくない小数点を含むことができます。だから1,13,24,50はOKですが、1.などはそうではありません。私は使用できるREGEXPはありますか?事前に正規表現
おかげで、 ティム
はこのお試しください:
/^(?:[1-9]|[1-4][0-9]|50)$/
を今、私は質問は、MySQLを参照するように更新されている参照のこと、これはかなりのものに変更されます。上記の正規表現は、MySQLでサポートされていない非キャプチャの括弧を使用しています。しかしそれはまた質問をする。あなたは本当に正規表現を使ってこの問題を解決すべきでしょうか?私たちは本当にあなたが1と50の間でなければならない、あなたの番号を格納しているかを見ている彼らがvarchar
のか?彼らはint
のか?私は両方の方法でそれを解決する方法を示します。まず私は、インデックスでテストテーブルを設定します:
create table regextest (
id int unsigned primary key auto_increment,
varchar_number varchar(5) not null,
int_number int not null,
index(varchar_number),
index(int_number)
) engine=innodb;
今、私たちのすべてのエッジケースがカバーされていることを確認すること、その中にいくつかのテストデータを置く:
insert into regextest (varchar_number, int_number)
values ('0', 0), ('1', 1), ('35', 35), ('49', 49), ('50', 50), ('51', 51);
そして今、ここではそのクエリがありますあなたの番号がvarchar_number
列内の文字列として格納されていると仮定し、あなたの問題を解決します:
mysql> select * from regextest where varchar_number rlike '^([1-9]|[1-4][0-9]|50)$';
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
| 2 | 1 | 1 |
| 3 | 35 | 35 |
| 4 | 49 | 49 |
| 5 | 50 | 50 |
+----+----------------+------------+
4 rows in set (0.00 sec)
これは動作しますが、それはuのことができないので、それは大規模なデータセットに対してうまく機能しますインデックスが存在していてもそのインデックスがあります。 MySQLはテーブルのすべての行に対して正規表現を1回実行する必要があります。 1と50の間にあなたの番号がint_number
列にint
sと保存したとします。
mysql> select * from regextest where int_number between 1 and 50;
+----+----------------+------------+
| id | varchar_number | int_number |
+----+----------------+------------+
| 2 | 1 | 1 |
| 3 | 35 | 35 |
| 4 | 49 | 49 |
| 5 | 50 | 50 |
+----+----------------+------------+
4 rows in set (0.00 sec)
このクエリは、インデックスを使用することができ、さらに読みやすく、保守性が高いため、パフォーマンスが向上します。すべて勝ちます。
ある'^(0?\d|[1-4]\d|50)$'
:
編集:上記は、あなたが本当に望ましくない0(および00)を許可します。だから、あなたが本当にとにかく許さ先行ゼロを望んでいなかったと仮定すると:
'^([1-9]|[1-4]\d|50)$'
は編集:OPの後のコメントは、これはMySQLのためのものであることを示したよう、私はパターンを指定するための構文を変更しました。
^([1-9] | [1-4] [0-9] | 50)Perl6::Rulesと$
この1
([0-4]{1}[0-9]{0,1}[.]{0,1}[0-9]{0,2}|50)
はFoのを行いますしてみてくださいお待ちください
45.00 - Match
4 - Match
78 - Not Match
51 - Not Match
21.25 - Match
3つの問題:(1)OPは小数点と一致させたくないと答えました。 (2)彼はまた、数字は「0」または「00」ではないと言っています。あなたの正規表現は両方とも一致します。 (3)あなたの数量化が必要です。 '{0,2}'は大丈夫ですが '{0,1}'は '?'と書かれ、 '{1}'は削除されるべきです。それは、とにかくやることを正規表現エンジンに伝えることです。アタッチされているアトムの1つに正確にマッチします。 –
こんにちは、ご意見ありがとうございます。私はMySQLで次のことを試しています:1 REGEXP '/ ^(?:[1-9] | [1-4] [0-9] | 50)$ /'を選択してください。反復演算子オペランドはregexpから無効です。私はこれがバックスラッシュをエスケープしないためかもしれないと思っていますが、私は/の代わりに//しようとしましたが、まだ動作しませんでした。 – Tim
@Tim:おそらく '(?:...)'の構文で、キャプチャしていないグループが導入されています。 MySQLはそれをサポートしておらず、 '? 'を反復演算子として扱うように思えますが、繰り返しは何もありません。 '(?:...)'を普通のかっこ '(...)'に置き換えると、うまくいくはずです。 –
ありがとう、私は/ ^(([1-9] | [1-4] [0-9] | 50)$ /)を試しましたが、正しい数字と一致しません。 – Tim