1에서 50까지의 숫자와 일치하는 정규 표현식을 찾고 있습니다. 지금까지 예제를 찾았지만 모두 문자열에 소수점을 포함 할 수 있습니다. 포함하지 않으려합니다. 그래서 1,13,24,50은 괜찮지 만 1. 등은 그렇지 않습니다. REGEXP를 사용할 수 있습니까? 사전에소수점이없는 1-50의 정규 표현
감사합니다, 팀
1에서 50까지의 숫자와 일치하는 정규 표현식을 찾고 있습니다. 지금까지 예제를 찾았지만 모두 문자열에 소수점을 포함 할 수 있습니다. 포함하지 않으려합니다. 그래서 1,13,24,50은 괜찮지 만 1. 등은 그렇지 않습니다. REGEXP를 사용할 수 있습니까? 사전에소수점이없는 1-50의 정규 표현
감사합니다, 팀
이 시도 :
는/^(?:[1-9]|[1-4][0-9]|50)$/
이 크게 일을 변경합니다. 위에서 언급 한 정규식은 MySQL에서 지원하지 않는 비 포획 괄호를 사용합니다. 그러나 그것은 또한 질문을 구걸한다. 이 문제를 해결하기 위해 정규 표현식을 사용해야합니까? 우리는 실제로 당신이 1에서 50 사이의 숫자를 저장하는 방법을 살펴야합니다. 그들은 varchar
입니까? 그들은 int
s입니까? 두 가지 방법으로 해결하는 방법을 보여 드리겠습니다.
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에서 50 사이의 숫자가 열에 int
으로 저장되었다고 가정합니다.
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을 사용할 수 있습니다. 그래서, 당신이 정말로 앞에 0이 어쨌든 허용 싶지 않았다 가정하면
'^([1-9]|[1-4]\d|50)$'
편집 : OP의 후기 댓글이 MySQL을위한 것임을 표시, 나는 패턴을 지정하기위한 구문을 변경했습니다.
Perl6::Rules와 "부정 행위"
/ (\d+) { 1 <= $1 && $1 <= 50 or fail }/
또는 최대 펄 5.10에서
,/(\d+)(?(?{1>$1||50<$1})(*FAIL))/
이 하나
([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
세 가지 문제 : (1) OP는 소수점과 일치하기를 원하지 않는다고 말했습니다. 그는 또한 숫자가 '0'또는 '00'이 될 수 없다고 말했습니다. 정규 표현식은 둘 모두와 일치합니다. (3) 당신의 한정어는 작업이 필요합니다; '{0,2}'는 괜찮지 만'{0,1}'은'?'로 쓰여지고 {1}은 삭제되어야합니다. 그것이하는 일은 정규식 엔진에 어쨌든 할 일을 지시하는 것입니다 : 첨부 된 원자 중 하나와 정확히 일치시킵니다. –
안녕하세요, 귀하의 의견을 보내 주셔서 감사합니다. 나는 MySQL에서 다음을 시도하고있다 : 1 REGEXP '/^(? : [1-9] | [1-4] [0-9] | 50) $ /'를 선택하면 오류가 발생한다 : 반복 연산자 피연산자가 'regexp에서 유효하지 않습니다. 나는 이것이 백 슬래시 (backslash)를 벗어나지 않기 때문인 것으로 보았다. // 대신 //를 시도했지만, 여전히 작동하지 않았다. 어떤 아이디어인가? – Tim
@Tim : 문제는 아마도 캡쳐되지 않은 그룹을 소개하는'(? : ...)'구문 일 것입니다. MySQL이 그것을 지원하지 않는 것처럼 들리며'? '를 반복 연산자로 처리하려고 시도하고 있습니다. 물론 반복 할 필요는 없습니다. '(? : ...)'를 보통 괄호'(...) '로 바꾸면 제대로 동작 할 것입니다. –
고마워요./^ (([1-9] | [1-4] [0-9] | 50) $ /)하지만 올바른 숫자와 일치하지 않습니다. – Tim