본문 바로가기
개발/TOOLS

정규식 00시작, 6~8자 숫자,영문 가능 영문1자 이상 만들기 구글 바드 사용기

by 꿈트리꿈트리 2023. 6. 7.

정규식 만드는 법을 알아보았습니다

원하는 형태

숫자 00으로 시작하고 총 문자열의 길이는 6자 이상 8자이하 3번째 자리부터는 영문이 

꼭 하나 이상 포함 되어야 한다는 정규식을 이전에  구글 바드에게 물어보았으나

원하는 답이 나오지 않았습니다.

 

https://dtree.kr/106

 

자바 정규식 만들기 쉽게 하는 법 AI 구글 바드

갑자기 문자열을 이용해 패턴이나 포함된 패턴을 찾아 내야 하는 문제가 생겼다. 정규식을 아예 하나도 모르는건 아니였지만 다 외우고 있지는 않는데 이걸 정규식을 배워서 테스트 하며 검증

dtree.kr

이런 문자들이 선택되고

0012345b
00123b
00b123
00c12345
00caaaaa

 

아래의 문자들은 탈락해야 하는데

001234
00123456
0012345b7
01123456
0112345b

 

챗 gpt등 복잡한 정규식을 잘 이해시키기는 힘들어 찾아 보니

^00(?=.*[a-zA-Z].*)(\w{6})$

이런 정규식을 얻게 되었는데 풀이 하자

 

^00 - 00문자로 시작하고

(?=.*[a-zA-Z].*) - 이 부분이 제일 헷갈리는데  

 

정규표현식 Lookahead, Lookbehind 기능

이라는 건데 정규식 표현식에 보면 () 괄호안의 것은 그룹으로 캡쳐 한다는

설명들도 있는데 이 말도 도통 어떤 기능인지 이해 하기가 힘든데

괄호로 둘러 싸여 있고 아래와 같은 패턴일 경우

?= 는 앞쪽의 패턴을 찾고 괄호안의 패턴을 

?<= 는 뒤쪽의 패턴을 매칭하고 조건을 보는 건데

어디선 전방 탐색 후방 탐색이라고 표현 하기도 하고 해서 쓰는데

자꾸 헷갈리네요

Lookahead 패턴

그래서 이부분은 (?=.*[a-zA-Z].*) 앞쪽의 탐색 조건 00으로 시작한다를 탐색후 매칭이 되는지 확인 하는 부분같은데

. - 어떤 문자이든

* - 없거나 전부 0회 이상

[a-zA-Z] - 알파벳이 있어야 하는거고

[a-zA-Z].*) - 뒤쪽에도 없거나 0회이상 아무거나 올수 있다는 패턴으로 이해

 

(\w{6})$ 이건 

$ - 마지막에 뒤쪽에서 패턴을 분석하는거라

뒤의 \w 문자는 6자 이어야 하고 를 뜻함

 

흠 결과를 놓고 보면 간단한거 같지만 직접 만드는건 먼가 좀 헷갈리고 맞는지 불안하다

AI에게 물어 보았을때는 간단한 경우는 잘 알려줬지만

복잡해 지면 소통이 잘 안되는 느낌이었고 그래서 내가 원하는 복잡한 패턴은

만들어 주지 못했다 그래서

바드에게 만들어 진것을 해석해 달라고 해 보았다

 

 

질문:

정규식 ^00(?=.*[a-zA-Z].*)(\w{6})$ 이거 해석해 줘

 

대답:

정규식 ^00(?=.*[a-zA-Z].*)(\w{6})<span class="math-inline">\은 00으로 시작하고, 영어 알파벳과 숫자, 특수문자 중 하나 이상을 포함하는 6자 이상의 문자열을 나타냅니다.
* `^`는 문자열의 시작을 나타냅니다.
* `00`은 00으로 시작해야 함을 나타냅니다.
* `(?=.*[a-zA-Z].*)`은 영어 알파벳과 숫자, 특수문자 중 하나 이상을 포함해야 함을 나타냅니다.
* `\w`는 영어 알파벳, 숫자, 특수문자를 나타냅니다.
* `{6}`는 6자 이상이어야 함을 나타냅니다.
* ``는 문자열의 끝을 나타냅니다.

예를 들어, 123456789, abcde1234, !@#<span class="math-inline">%^&\*\는 이 정규식과 일치하는 문자열입니다. 반면에, `123456`, `abcde`, `!@#%`는 이 정규식과 일치하지 않는 문자열입니다.

 

여기까지가 대답인데 

^00(?=.*[a-zA-Z].*)(\w{6})$ 이 정규식을 사용하였을때는 123456 은 통과를 못하나

바드의 대답은 123456도 통과 된다고 나오고 잘 작동되는 정규식을 넣어도 이상한 답변이 나왔다

 

그래서 질문을 정규식 "^00(?=.*[a-zA-Z].*)(\w{6})$" 이거 해석해 줘

따옴표를 붙여서 넣어 보니 대답은

 

^00(?=.*[a-zA-Z].*)(\w{6})$는 다음과 같이 해석됩니다.

^는 문자열의 시작을 나타냅니다.
00은 두 개의 0을 나타냅니다.
(?=.[a-zA-Z].)는 문자열에 최소한 하나의 영어 소문자가 포함되어 있어야 한다는 것을 나타냅니다.
(\w{6})는 문자열의 끝에서 6개의 문자를 나타냅니다.
$는 문자열의 끝을 나타냅니다.
즉, 이 정규식은 두 개의 0을 포함하고 최소한 하나의 영어 소문자가 포함된 6개의 문자로 구성된 문자열을 일치시킵니다.

예를 들어, "00abcd123"는 이 정규식과 일치하는 문자열이지만, "00123456"는 일치하지 않는 문자열입니다.

 

답처럼 보이고 비슷해 보이지만 00abcd123 얘는 8자가 넘어서 매칭이 되면 안되는데 일치 한다고 나오는 이상한 답변이 돌아왔다.

(?=.[a-zA-Z].) 요 부분에선 *도 생략해 버리고

 

아무튼 아직 AI를 전적으로 믿기는 힘든거 같고 참고용으로 사용해야 할거 같다.

부정확한 답변이지만 굉장히 신뢰성 있게 말하는게 더 불안하다

 

 

정규식을 자주 쓰면 제대로 배워서 익히면 좋을거 같지만 어쩌다 한번 사용하고 먼가 정확한 룰을 모르겠는게

그렇다고 깊게 파기엔 시간이 아깝고 나만 그러진 않을꺼 같은데 

어여 AI들이 더 발전해서 이런거 원하는대로 뚝딱 만들어 주면 좋을거 같다.

바드가 정확한 답변을 주지는 않았지만 참조용으로 사용하면 될거 같고 정규식은 헷갈리지만 

필요할때마다 익히면서 적응하면 될거 같다.