문제
정규 표현식으로 순열을 얻는 쉬운 방법은 없습니다.
- 순열은 : 얻기 단어 번호를 변경하거나 종류의 문자 않고, 다른 순서 ( "AABC을").
- 정규식 : 정규식.
확인을 위해 :
- "반복없는 정규식 순열" 정답은 정규식 대신 JavaScript 코드를 작성합니다.
- "주어진 텍스트에서 주어진 단어의 모든 순열을 찾는 방법" – 정답도 사용하지 않습니다.
- "반복없이 모든 {1, 2, 3, 4}와 일치하는 정규식" – 정답을 사용하지만, 적응성도 단순하지도 않습니다.
- 이 답변은 "정규 표현식은 원하는 것을 수행 할 수 없습니다 . 문자열에서 순열을 생성 할 수 없습니다"라고 주장 합니다.
내가 찾고있는 솔루션의 종류
다음과 같은 형식이어야합니다.
- »aabc«(또는 다른 괄호를 사용할 수있는 다른 것)
- (aabc)! ((abc)와 비슷하지만 끝에 다른 기호가 있음)
- [aabc]! ([abc] +와 유사하지만 끝에 다른 기호가 있음)
이 솔루션의 장점
그들은:
- 쉬운
- 적응할 수 있는
- 재사용 가능
이것이 존재해야하는 이유
- 정규식은 정규 언어의 문법을 설명하는 방법입니다. 그들은 모든 종류의 정규 언어가 될 수있는 모든 힘을 가지고 있습니다.
- 일반 언어는 순열에 충분할 정도로 강력합니다 (아래 증명). 이것을 표현하는 쉬운 방법이없는 이유는 무엇입니까?
그래서 내 질문은 :
- (왜) 내 증거가 잘못 되었나요?
- 맞다면 : 순열을 표현하는 쉬운 방법이없는 이유는 무엇입니까?
증거
- 정규 표현식은 정규 언어의 문법을 주목하는 한 가지 방법입니다. 정규 언어 문법을 설명 할 수 있습니다.
- 정규 언어 (알파벳 내에 유한 한 글자 수를 가진) 문법을 설명하는 또 다른 방법은 결정적이지 않은 오토 마톤 (유한 한 수의 상태)입니다.
유한 한 글자 수를 가지고이 오토 마톤을 만들 수 있습니다 : (예. 형식 : 아래 참조)
"abbc"의 순열을 허용하는 문법 :
(위에 숫자를 검색하십시오. 어쩌면 누군가 가이 부분을 더 잘 보이게하는 방법을 알고있을 것입니다)
s-> 아 ¹
s-> bh²
s-> ch³
h¹-> bh¹¹
h¹-> ch¹²
h²-> 아 ¹¹ (오타가 없습니다!)
h²-> bh²²
h²-> ch²³
h³-> 아 ¹²
h³-> bh²³
h¹¹-> bc
h¹¹-> cb
h¹²-> bb
h²²-> ac
h²²-> ca
h²³-> ab
h²³-> 바
더 공식적인 : (유한 상태-자동 사용하지만 문법으로도 만들 수 있음)
- 순열이 허용 상태에 도달해야하는 단어 q (유한 길이)
- X는 유한 알파벳입니다.
- 상태 집합 S에는 최대 q 길이의 문자 순서가 포함됩니다. (따라서 S의 크기는 유한합니다.) 그리고 "더 이상 단어"의 한 상태가 더해집니다.
- 문자를 취하고 단어의 현재 읽은 부분에 해당하는 상태로 이동하는 상태 전이 함수 d.
- F는 q의 정확한 순열 인 상태 집합입니다.
따라서 주어진 단어의 순열을 받아 들일 수있는 유한 상태 오토 마톤을 만들 수 있습니다.
증거로 진행
그래서 정규 언어가 순열을 검사 할 수있는 힘을 가지고 있음을 증명했습니다.
그렇다면 왜 Regexes를 사용하여 접근 할 수 없습니까? 유용한 기능입니다.
^(a()|a()|b()|c()){4}\2\3\4\5$
(참조 작동하는 것 같다 regex101.com/r/9URPpg/4/tests을 ).