IT,프로그래밍/신비한 오류 사전

[정규식] 문자과 숫자가 섞였을때 (부제 : 이게 외 않되?)

정규식 않이 이게 외 않되?

정규식 않이 이게 외 않되?

오늘 코딩을 하던중 정규식을 쓸일이 있었다.


여기서 정규식이란, 일정한 규칙 으로 특정 조건을 표시해 주는  을 뜻한다. 
나무위키-정규식


다른 간단한것들은 JS 의 Split() 이나 replace() 등 으로 해결해 나갔는데


문제는 바로 이부분 이었다.



NOTE : 3줄요약은 글 마지막에 있습니다.

오늘의 문제.

MY-SQL 의 CREATE Query 문을 MS-SQL 문법에 맞게 바꿔주는 웹을 만드는 중 이었다.


CREATE TABLE dept (
dept_no INT(11) unsigned NOT NULL,
dept_name VARCHAR(32) NOT NULL,
PRIMARY KEY (dept_no)
);

출처 : 제타위키

위와 같은 SQL 문을 text 에 입력하면 MS-SQL 문법에 맞게 INT(11) 를 INT 로 바꿔주게 만들었어야 했다


정규식으로 /^INT[(][0-9][)]/ 그냥 이런식으로 하면 될줄알았다.


결과는…




당연했다. 이전까지 정규식을 직접 거의 써본적 없고 있더라도 [0-9] 혹은 [a-z | 0-9] 와 같이 기초적인것만 쓰다가


숫자와 문자가 뒤섞인 그리고 가운데 숫자가 계속 바뀌는 정규식을 짜자니 멍청해진것과 같은 기분이었다.


어찌저찌 구글링을 해서 숫자와 문자가 섞인 예제를 찾는다고 찾았는데…


/^<a href="%5b-_.%5d?%5b0-9a-zA-Z%5d">0-9a-zA-Z</a>*@<a href="%5b-_.%5d?%5b0-9a-zA-Z%5d">0-9a-zA-Z</a>*.[a-zA-Z]{2,3}$/i;




이게 뭔가 싶었다. 이걸보고 알턱이 있나…

이때 깨닳은건 문자와 숫자가 섞인 예제가 생각보다 없었다는것 이었다.


해결법

결론만 말하자면 저 퍼즐의 답은 /int[\D][0-9]*[\D]g 였다.

temp_result = temp_result.replace(/int[\D][0-9]*[\D]/g, "int");

라는 코드로 int 로 전부 바꿔줄수 있었다.


정규식을 하나하나 스텝별로 해석해보자면 이렇다.


  1. / : 정규식의 시작

  2. /int : int 문자열을 찾아라

  3. /int[\D]: int와 문자나 숫자가 아닌것을 찾는다 여기에선 ( 가 된다

  4. /int[\D][0-9]* : int와 숫자가 아닌것 그리고 숫자 '들을'찾는다

  5. /int[\D][0-9]*[\D]/: int와 숫자가 아닌것 그리고 숫자가 ‘들을’ 그리고 다시 문자나 숫자가 아닌것을 찾는다

  6. /int[\D][0-9]*[\D]/g : 전체에서 int와 숫자가 아닌것 그리고 숫자가 ‘들을’ 그리고 다시 숫자가 아닌것을 전부 찾는다


따라서 나는 저 소스로 입력한 문자열의 모든 int( ) 들을 한번에 int 로 치환할수 있었다!

결론

회사 업무용으로 간단하게 만들어 보고 있는건데 생각보다 만들어보니 재미가있다. 

그래서 좀더 신경써서 QUERY converter 를 만들어 볼까해서 내깃허브에 커밋해보고 있다.


이번 정규식은 오늘 배운걸 안까먹기위해 많이 부족하고 잘못된 설명이 있을수도 있으니


읽으시던 도중 첨언해 주시면 감사하겠습니다!

3줄요약

  1. 정규식이란 규칙을 이용하여 특정 문자를 표시해 주는 식이다.

  2. 나무위키-정규식 을 참조하면 정규식에 대해 쉽게 배울수 있다 (쉽게 배울수 있댔지 정규식이 쉽다곤 하지 않았다.)

  3. 모르는게 많으니 도와주세요