[Java] 정규표현식 연습

Date:     Last Updated:

문제명

문제 프로그래머스 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

//정규표현식 매칭 조건

  1. 처음-중간-끝 이렇게 3부분으로 구성되어있다.(통신사번호, 지역변호 등 구분이 있지만 그건 중요한 게 아니니 생략)
  2. -가 있을 수도 없을 수도 있다.(있다 없다 외에는 매칭하지 않는다.)
  3. 010이면 중간은 4자리이다.
  4. 01[1256789]라면 중간이 3자리 또는 4자리이다.
  5. 끝자리는 4자리 고정이다.
  6. -제외하고는 숫자만 가능하다.
  7. 처음은 0으로 시작해야한다.
  8. 처음과 끝을 판별해야한다.

//정규표현식을 혼자서 만들면 어딘가 빈틈이 있을 수 있어서 항상 조심하겠지만 그래도 뭔가 이거 만들때는 항상 재미 있다. //계속 쓰다보면 익숙해질테고, 이번에 하면서 ^$을 좀 정확히 쓰게 됐다. //^를 제일 앞에 쓰면 문자열의 시작([^]이건 제외를 의미), $를 제일 끝에 쓰면 문자열의 끝을 지정해줄 수 있다.

//그 전 정규표현식 //이 표현식은 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