정규식에서 연속된 문자 혹은 숫자를 감지할 수 있을까요?

누가 사용가능한 암호 패턴에 대해서 물어봤는데
패턴의 조건중 하나가 3개 이상의 연속된 문자나 숫자 (역순도 포함)를
넣지 못하게 하는것을 regex로 처리할 수 있는가 하는건데…
저는 아무리 생각해봐도 정규식만으로 처리할 수 없을것 같습니다.
정규식이 워낙 다재다능한지라 제가 모르는 방법이 있는지 궁금하네요.

조건 예) ab => OK, abc => NOK, acb => OK, cba => NOK

저는 안된다고 했는데 계속 찜찜해서 질문드려봅니다.

안녕하세요?

저도 정규식으로 연속되는 값을 찾는건, 간단하게는 힘들거 같다고 생각합니다.
모든 경우의 연속된 값을 정해준다면 가능할 것 같긴 하죠.

예를 들면
/(123|234| … )$ 뭐 이런식으로 한다면야… ㅎㅎㅎ
의미가 없죠 ㅎㅎㅎ

말씀하신 거와, 예제가 좀 …맞지 않는거 같은데요, 제가 말귀가 좀 어두워서 ㅎㅎ.

이런거 혹시 말씀하시는건지,

잘 모르지만, 도움 되시길 바랍니다.

연속해서 같은 문자를 입력한 것을 걸러내는건 ([a-z]{n, }|[0-9]{n,}) 으로 충분하겠습니다만 연속된 순열이나 문자열을 걸러내는건 글쎄요… :thinking:

위의 정규식으로 잡아낸 다음 루프 한번씩 돌려줘야 하지 않을까 싶습니다.

1 Like

안녕하세요. 잘지내셨는지요 ㅎㅎ
제가 질문을 좀 헷갈리게 했네요
이어지는 문자나 숫자를 막을려고 하는건데요…
예를 들어, ABC 와 같은것을 막을려고 하는거죠.
역순으로 입력해도 막고, 숫자도 같은 패턴을 하려고 할때…
regex 만으로 저런 패턴을 찾을 수 있는가가 궁금해서요.
물어본 사람은 이것저것 조합해서 했다고 하는데…
저는 순수 regex로 가능할까가 궁금했거든요.
아무래도 안될것 같아요. :slight_smile:

노가다로 하시면 됩니다

^*(abc|bcd|cde|...|xyz)*$
^*(012|123|234|345|456|567|678|789)*$

쉬운 방법은 없냐고요?
정규 표현식은 “증가수열” 같은거 모릅니다

1 Like

대문자까지 하려면 많이 골때리겠는데요…

/i 플래그 붙이면 되려나요?

아 시퀸스 말씀하신거 군요, ㅎㅎ. 그렇다면, 꼬마야님과 다른 여러분들이 말씀하신대로, 굉장히 까다롭거나 불가능에 가까울것 같읍니다.

노가다로 전부를 정규표현식으로 걸어야 하므로 의미가 없습니다.
그냥 조건을 검사하는 로직을 구현하시는게 성능이 더 좋을거 같습니다.

정규표현식으로 안하면 Aho-Corasick 알고리즘이라는 물건이 있습니다

대단한 알고리즘이네요.
좀더 봐야겠지만 aho-corasick으로 이어지는 문자열은 어떻게 찾을지는 좀 고민해봐야겠네요.
좋은 정보 감사합니다.

안녕하세요?

제 생각에는 그냥 앞뒤 문자를 비교하면 될거같은데요.
앞의 문자가 정해지면 뒤의 문자가 연속되는건지 아닌지 확인하는건 그리 어렵지 않으니까요. 그렇게 쭉 나가면서 두번연속으로 앞뒤문자가 같은 경우만 걸러주면 되니 O(n)이 되지 않을까요?

거기서 더 나가면 문자열 쪼개서 멀티스레드 돌려도 되지만
어차피 비밀번호 길어봐야 20자리일테니 ㅎㅎ

저는 순수 regular expression으로 가능한가가 궁금했거든요.
저한테 이걸 물어본 사람은 일부만 regex 쓰고 나머지는 하드코딩했다고 하더군요.
저는 순수 regex로 가능할까가 궁금했던건데, 지금 생각은 안된다고 생각하고있어요