5

1 から 50 までの任意の数値に一致する正規表現を探しています。これまでのところ、例を見つけましたが、それらはすべて、文字列に小数点を含めることを許可していますが、これは含めたくありません。したがって、1、13、24、50 は問題ありませんが、1. などは問題ありません。使用できる REGEXP はありますか?

前もってありがとう、ティム

4

5 に答える 5

10

これを試して:

/^(?:[1-9]|[1-4][0-9]|50)$/

アップデート:

MySQL を参照するように質問が更新されていることがわかりましたが、これにより状況が大きく変わります。上記の正規表現は、MySQL でサポートされていない非キャプチャ括弧を使用しています。しかし、それはまた疑問を投げかけます。この問題を解決するために本当に正規表現を使用する必要がありますか? 1 から 50 までの数値をどのように格納しているかを実際に確認する必要があります。それらはvarchars ですか? 彼らは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 までの数値がintsとして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)

このクエリは、インデックスを使用でき、読みやすく、保守しやすいため、適切に実行されます。周りで勝つ。

于 2010-12-03T06:26:57.730 に答える
4
'^(0?\d|[1-4]\d|50)$'

あれは:

  • 入力の始まり
  • その後に 1 桁の数字が続く (オプションで前に 0 を付ける)、または
  • 1 ~ 4 の後に任意の数字が続く、または
  • 続いて50
  • 次に、入力の最後が表示されることを確認します。

編集:上記では、0(および00)が許可されていますが、これは絶対に望ましくありません。したがって、とにかく先頭のゼロを許可したくないと仮定すると、次のようになります。

'^([1-9]|[1-4]\d|50)$'

編集: OPの後のコメントは、これがMySQL用であることを示しているため、パターンを指定するための構文を変更しました。

于 2010-12-03T06:27:18.993 に答える
2

^([1-9]|[1-4][0-9]|50)$

于 2010-12-03T06:28:18.040 に答える
0

これを試してください

([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
于 2010-12-03T08:07:32.013 に答える
0

Perl6::Rulesによる「不正行為」:

/ ( \d+ ) { 1 <= $1 && $1 <= 50 or fail } /

または Perl 5.10 以降では、

/(\d+)(?(?{1>$1||50<$1})(*FAIL))/
于 2010-12-03T06:40:45.320 に答える