개발 Q&A

제목 정규표현식 질문
글쓴이 루아루아루 작성시각 2014/09/17 14:10:16
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 12080   RSS
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 >';
 } 
}