1 から 50 までの任意の数値に一致する正規表現を探しています。これまでのところ、例を見つけましたが、それらはすべて、文字列に小数点を含めることを許可していますが、これは含めたくありません。したがって、1、13、24、50 は問題ありませんが、1. などは問題ありません。使用できる REGEXP はありますか?
前もってありがとう、ティム
これを試して:
/^(?:[1-9]|[1-4][0-9]|50)$/
MySQL を参照するように質問が更新されていることがわかりましたが、これにより状況が大きく変わります。上記の正規表現は、MySQL でサポートされていない非キャプチャ括弧を使用しています。しかし、それはまた疑問を投げかけます。この問題を解決するために本当に正規表現を使用する必要がありますか? 1 から 50 までの数値をどのように格納しているかを実際に確認する必要があります。それらはvarchar
s ですか? 彼らは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)
これは機能しますが、インデックスが存在していてもインデックスを使用できないため、大規模なデータ セットではパフォーマンスが低下します。MySQL は、テーブル内の行ごとに正規表現を 1 回実行する必要があります。1 から 50 までの数値がint
sとしてint_number
列に格納されているとします。これを簡単に行うことができます:
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)$
これを試してください
([0-4]{1}[0-9]{0,1}[.]{0,1}[0-9]{0,2}|50)
以下を行います
45.00 - Match
4 - Match
78 - Not Match
51 - Not Match
21.25 - Match
Perl6::Rulesによる「不正行為」:
/ ( \d+ ) { 1 <= $1 && $1 <= 50 or fail } /
または Perl 5.10 以降では、
/(\d+)(?(?{1>$1||50<$1})(*FAIL))/