2010-12-03 8 views
4

1에서 50까지의 숫자와 일치하는 정규 표현식을 찾고 있습니다. 지금까지 예제를 찾았지만 모두 문자열에 소수점을 포함 할 수 있습니다. 포함하지 않으려합니다. 그래서 1,13,24,50은 괜찮지 만 1. 등은 그렇지 않습니다. REGEXP를 사용할 수 있습니까? 사전에소수점이없는 1-50의 정규 표현

감사합니다, 팀

답변

6

이 시도 :

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

업데이트 : 이제 문제는 MySQL을 참조하도록 업데이트되었습니다 볼 것을

이 크게 일을 변경합니다. 위에서 언급 한 정규식은 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

안녕하세요, 귀하의 의견을 보내 주셔서 감사합니다. 나는 MySQL에서 다음을 시도하고있다 : 1 REGEXP '/^(? : [1-9] | [1-4] [0-9] | 50) $ /'를 선택하면 오류가 발생한다 : 반복 연산자 피연산자가 'regexp에서 유효하지 않습니다. 나는 이것이 백 슬래시 (backslash)를 벗어나지 않기 때문인 것으로 보았다. // 대신 //를 시도했지만, 여전히 작동하지 않았다. 어떤 아이디어인가? – Tim

+0

@Tim : 문제는 아마도 캡쳐되지 않은 그룹을 소개하는'(? : ...)'구문 일 것입니다. MySQL이 그것을 지원하지 않는 것처럼 들리며'? '를 반복 연산자로 처리하려고 시도하고 있습니다. 물론 반복 할 필요는 없습니다. '(? : ...)'를 보통 괄호'(...) '로 바꾸면 제대로 동작 할 것입니다. –

+0

고마워요./^ (([1-9] | [1-4] [0-9] | 50) $ /)하지만 올바른 숫자와 일치하지 않습니다. – Tim

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

즉 :

어느 하나로
  • 한 자리 (옵션 0 앞에) 다음에 입력
  • 의 시작 또는 1-4 하였다
  • 따라 또는
  • 다음에 50
  • 을 입력 한 다음 입력이 끝나야합니다.

편집 : 위의 내용을 통해 원하지 않는 0과 00을 사용할 수 있습니다. 그래서, 당신이 정말로 앞에 0이 어쨌든 허용 싶지 않았다 가정하면

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

편집 : OP의 후기 댓글이 MySQL을위한 것임을 표시, 나는 패턴을 지정하기위한 구문을 변경했습니다.

+2

이것은 허용되지 않는 '0'과 일치합니다. – Asaph

+0

@Asaph 맞습니다! 감사; 수정본을 보여주기 위해 편집했습니다. – Phrogz

+0

감사합니다 ... MySQL은 위에서 언급 한 것과 같은 반복되지 않는 오류를 제공합니다 ... – Tim

1

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

+0

1 ~ 9 또는 10 ~ 49 OR 50 –

+0

감사합니다. 그러나 이것은 예 1을 허용합니다. – Tim

+0

@Tim 위의 설명이 "그것이'''을 허용한다는 것을 의미하면, 당신은 잘못되었습니다 : 그것은 마침표를 허용하지 않습니다. 만일 당신의 코멘트가 "1을 허용한다"는 것을 의미한다면, 이것은 당신이 명시 적으로 일치해야한다고 말한 것입니다. 위의 패턴은 나에게 잘 보입니다. – Phrogz

0

Perl6::Rules와 "부정 행위"

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

또는 최대 펄 5.10에서

,

/(\d+)(?(?{1>$1||50<$1})(*FAIL))/ 
+0

또는 Perl5 :'/^(\ d +) $ (? (? {1 $ 1}) (* FAIL))/x' – tchrist

+0

@tchrist : 감사합니다. – ephemient

0

이 하나

([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 
+0

세 가지 문제 : (1) OP는 소수점과 일치하기를 원하지 않는다고 말했습니다. 그는 또한 숫자가 '0'또는 '00'이 될 수 없다고 말했습니다. 정규 표현식은 둘 모두와 일치합니다. (3) 당신의 한정어는 작업이 필요합니다; '{0,2}'는 괜찮지 만'{0,1}'은'?'로 쓰여지고 {1}은 삭제되어야합니다. 그것이하는 일은 정규식 엔진에 어쨌든 할 일을 지시하는 것입니다 : 첨부 된 원자 중 하나와 정확히 일치시킵니다. –

관련 문제