제목 | 정규표현식 질문 | ||
---|---|---|---|
글쓴이 | 루아루아루 | 작성시각 | 2014/09/17 14:10:16 |
|
|||
db 필드 안에 다음과 같은 값들이 있습니다. 고등학교, XX고, 고1, 고, 중, 중학교, XX중, 중1, 초등, 초, XX 초 네 현재 학교를 나타내는건데 여기서 고등학생 / 중학생 / 초등학생을 분류하고자 where절에 정규표현식을 적을까 합니다. 간단히 예를 들자면 고등학생 : '고'가 들어간건 다 찾는데, '고'가 들어간 초중학교는 제외. 그래서 찾아낸 간단한 식이 [고][^(중|초)] 인데 첫번째 문제는 '고중'은 걸러지는데 '고전중'은 안걸러지네요. 두번째 문제는 이 식을 mysql에 그대로 적용하면 www.regexr.com에서 적용한 결과값이랑 다르더군요. 큰 혼란중입니다;; 어떻게 표현해야 할까요;; |
|||
다음글 | 폼검증시 에러가 발생하면 다시 리턴될때 기존 페이지에 ... (7) | ||
이전글 | 배열 객체를 삭제 하는 명령어는 없나요?? (13) | ||
변종원(웅파)
/
2014/09/17 14:33:30 /
추천
0
|
letsgolee
/
2014/09/17 15:44:13 /
추천
0
쉽게 보자면 생각보다 간단할 수 있습니다. 가장 간단한 공식은 "~~~초|중|고" 이겠죠? 그럼 뒤에 붙은 "(등)학교"를 삭제 하면 나머지가 나옵니다.
만일 그걸 한 식에 넣어야 한다면 '(.*)(초|중|고)(등)?(학교)?([1-3])?' 이렇게 되나요? 다음은 심심해서 한 테스트 결과입니다: mysql> create table t1 ( -> id integer primary key auto_increment, -> school varchar(50) not null); Query OK, 0 rows affected (0.14 sec) mysql> insert into t1 values (1, '상산고'), (2, '고1'), (3, '중'), (4, '초'); Query OK, 4 rows affected (0.04 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> insert into t1 values (null, '고'), (null, '중학교'), (null, '고등학교'); Query OK, 3 rows affected (0.02 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> insert into t1 values (null, '전주초'), (null, '진북초등'); Query OK, 2 rows affected (0.02 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> alter table t1 add ab varchar(20); Query OK, 9 rows affected (0.21 sec) Records: 9 Duplicates: 0 Warnings: 0 mysql> select * from t1; +----+----------+------+ | id | school | ab | +----+----------+------+ | 1 | 상산고 | NULL | | 2 | 고1 | NULL | | 3 | 중 | NULL | | 4 | 초 | NULL | | 5 | 고 | NULL | | 6 | 중학교 | NULL | | 7 | 고등학교 | NULL | | 8 | 전주초 | NULL | | 9 | 진북초등 | NULL | +----+----------+------+ 9 rows in set (0.00 sec) mysql> update t1 set ab = '고' where school regexp '(.*)고(등)?(학교)?([1-3])?'; Query OK, 4 rows affected (0.03 sec) Rows matched: 4 Changed: 4 Warnings: 0 mysql> select * from t1; +----+----------+------+ | id | school | ab | +----+----------+------+ | 1 | 상산고 | 고 | | 2 | 고1 | 고 | | 3 | 중 | NULL | | 4 | 초 | NULL | | 5 | 고 | 고 | | 6 | 중학교 | NULL | | 7 | 고등학교 | 고 | | 8 | 전주초 | NULL | | 9 | 진북초등 | NULL | +----+----------+------+ 9 rows in set (0.00 sec) |
들국화
/
2014/09/17 16:18:01 /
추천
0
처음에 설계가 잘못되면 고생이죠.
제생각에는 끝나는 글자 패턴을 정해서 검색해서 필드를 추가하고 학교 등급(?)을 넣는게 좋을것 같네요. 고등학교 : (.*)고$ (.*)고등학교$ 초등학교 (.*)초$ (.*)초등학교$ ...... |
루아루아루
/
2014/09/17 17:03:46 /
추천
0
오오 다들 감사합니다. 직접 쿼리문으로 테스트까지 해주셨네요. 꾸벅
저도 넘겨 받은거라 ㅠㅠ 원래 입력할때 들어가는 데이터의 형태를 정해놨어야 하는데 ㅎㅎ 다시 한번 해보겠습니다 감사드립니다 |
darkninja
/
2014/09/18 20:24:51 /
추천
0
재미있는 정규식이군요!
감사히 가지고 놀겠습니다^^ 저도 심심해서 해봤습니다. $contents = ''; $contents .= '서울:[ 초 ]'; $contents .= '서울:[ a초등 ]'; $contents .= '서울:[ b중 ]'; $contents .= '서울:[ c고 ]'; $contents .= '서울:[ d대 ]'; $contents .= '제주:[고]'; $search = '서울'; $search_school = '초 {0,}|초등 {0,}|중 {0,}|고 {0,}'; $pattern = "/".$search.":?([\[][^\]]+(".$search_school.")[\]])*/i"; $matches = array(); preg_match_all($pattern, $contents, $matches); foreach ($matches[1] as $matche) { if(!empty($matche)){ echo $search.' : '.$matche.' <br >'; } } |
정규식 잘 아시는 분이 답변해주세요. ^^