[Java] 정규표현식 연습
문제명
문제 프로그래머스 FAQ 내용을 보니 카카오나 기업의 문제들은 저작권이 있으니 풀이를
github나 개인블로그에 올리지 말라고 되어 있어서 링크로 대체합니다.
출처: Programmers
문제명
제목 그대로 정규식 연습하는 사이트 추천!!
https://regexr.com
https://regexper.com
https://regex101.com
https://www.debuggex.com
개인적으로 가장 첫번째가 가독성이 좋아보인다.
추후 사용해보고 다시 어떤 사이트가 더 나은지는 다시 올리겠다.
//21년 6월에 01x번호들이 사라져서 현재는 조건이 훨씬 간단해졌다. 010-xxxx-xxxx로 가운데 3자리조차 없다. //연습을 위해서 아직 01x와 가운데 3자리가 있다고 가정했다. //전역검색과 멀티라인으로 검색한다고 가정한다. /gm
//정규표현식 매칭 조건
- 처음-중간-끝 이렇게 3부분으로 구성되어있다.(통신사번호, 지역변호 등 구분이 있지만 그건 중요한 게 아니니 생략)
- -가 있을 수도 없을 수도 있다.(있다 없다 외에는 매칭하지 않는다.)
- 010이면 중간은 4자리이다.
- 01[1256789]라면 중간이 3자리 또는 4자리이다.
- 끝자리는 4자리 고정이다.
- -제외하고는 숫자만 가능하다.
- 처음은 0으로 시작해야한다.
- 처음과 끝을 판별해야한다.
//정규표현식을 혼자서 만들면 어딘가 빈틈이 있을 수 있어서 항상 조심하겠지만 그래도 뭔가 이거 만들때는 항상 재미 있다. //계속 쓰다보면 익숙해질테고, 이번에 하면서 ^$을 좀 정확히 쓰게 됐다. //^를 제일 앞에 쓰면 문자열의 시작([^]이건 제외를 의미), $를 제일 끝에 쓰면 문자열의 끝을 지정해줄 수 있다.
//그 전 정규표현식 //이 표현식은 010일때는 가운데와 마지막이 4자리여야 하는데 가운데가 3자리여도 통과가 됐다. //아직 정규표현식에서의 |(or) 을 제대로 이해 못한것 같다.
^(010 | 01[1-25-9])[-]?([\d]{4} | [\d]{3,4})[-]?([\d]{4})$ |
//입력 데이터 010-4502-0614 010-4151-09234 010-145502-890 011-947751102-028903 000-842-0890 0110-452-7897 010-4511-0616514 101-4632-0611234 010-5614-5958 010-2245-9573 01045020614 011-271-6863 0105271-6863 012-333-2223 0193245968 0104502061
//매칭 데이터 010-4502-0614 010-5614-5958 010-2245-9573 01045020614 011-271-6863 0105271-6863 012-333-2223 0193245968 0104502061
//마지막 정규표현식 //중복부분이 있지만 내가 생각한 기준은 모두 통과한다. //바로 위꺼는 처음 가운데 마지막으로 찾는데 //이거는 처음과 가운데를 하나로 친다. //마지막은 무조건 4자리니까 고정이고 ^(010[-]?[\d]{4}|01[1-25-9][-]?[\d]{3,4})([-]?[\d]{4})$
//입력 데이터 010-4502-0614 010-4151-09234 010-145502-890 011-947751102-028903 000-842-0890 0110-452-7897 010-4511-0616514 101-4632-0611234 010-5614-5958 010-2245-9573 01045020614 011-271-6863 0105271-6863 012-333-2223 0193245968 0104502061
//매칭 데이터 010-4502-0614 010-5614-5958 010-2245-9573 01045020614 011-271-6863 0105271-6863 012-333-2223 0193245968
//이건 멀티라인이 아니고 그냥 문자열을 통으로 읽었을떄 모든 조건 찾는 조건식 //매칭의 끝 다음으로 오는 문자열이 숫자가 아니거나 문자열의 끝이면 찾도록 했다. //010-4444-4555** 이런 조건이면 찾을 수 있도록 말이다. //010-3332-496889 이 조건은 매칭 안함 //다만 문제는 매칭의 끝 다음 부분도 같이 매칭된다는 점이다 *,\s,\n등 맨 끝에 붙는다. //지우는 표현식은 뭘까.. //아니면 그 앞까지만 가능하도록 하면 될텐데
(010[-]?[\d]{4} | 01[1-25-9][-]?[\d]{3,4})([-]?[\d]{4}+([^\d] | $)) |
//입력데이터 010-4502-0614 010-4151-0923 010-4151-09234 010-145502-890 011-947751102-028903 000-842-0890 0110-452-7897 010-4511-0616514 101-4632-0611234 010-5614-5958 010-2245-9573 01045020614 011-271-6863 0105271-6863 012-333-2223 01932459699 011-455-2122
//매칭데이터 010-4502-0614 010-4151-0923
010-5614-5958
010-2245-9573
01045020614
011-271-6863
0105271-6863
012-333-2223
01932459699
011-455-2122
문제의 이해
내가 생각한 풀이 방법
풀이
첫 번째 풀이
/////하던거 //조건 ((\D|\b)(010[-]?[\d]{4}|01[1-25-9][-]?[\d]{3,4})[-]?[\d]{4})(\D|$|\s|\n)
//입력 010-4502-0614 010-4151-0923 010-4151-0923aasasf 010-145502-890 011-947751102-028903 000-842-0890 0110-452-7897 010-4511-0616514 101-4632-0611234 010-5614-5958,, 010-2245-9573#@ 01045020614 011-271-6863ll 0105271-6863&&^^ 012-333-2223012-333-2223 01932459699 011-455-2122asdf 011-455-2122dfgdfgadf 012-933-2112
////////////////
010-4502-0614 010-4151-0923
010-4151-0923a
010-5614-5958,
010-2245-9573#
01045020614
011-271-6863l
0105271-6863&
01932459699
011-455-2122a
011-455-2122d
012-933-2112
010-4502-0614 010-4151-0923 010-4151-0923 010-5614-5958 010-2245-9573 01045020614 011-271-6863 0105271-6863 01932459699 011-455-2122 011-455-2122 012-933-2112
Leave a comment