정규식과 일치하는 문자열을 생성하기 위해 this algorithm을 작성했습니다. 정말 잘 작동하지만 아직 몇 가지 기능이 없습니다.문자 클래스를 반복 할 수 있도록이 정규식 역전 알고리즘을 어떻게 리팩터링해야합니까?
예를 들어, \d{3}
을 뒤집을 때 먼저 번호를 선택하고 같은 번호를 3 번 반복합니다. 나는 3 개의 다른 수를 선택하고 싶으면.
이 문제를 해결하는 가장 쉬운 방법은 \d
을 토큰 목록에 밀어 넣고 후에 이후에 한정자를 지정하는 것입니다.
괜찮습니다. 멋지지만, 구문 분석하는 방법은 (a(b)){2}|(c)\3
입니다. "나중에 평가"전략을 따르고 있다고 가정하면이 값은 "(a(b))
, (a(b))
또는 (c)
, \3
"으로 토큰 화됩니다. 실제로 몇 가지 문제가 발생합니다. 난 그냥 실제로 나는 번호 참조 (ab
이 b
이 \2
입니다 \1
이며, c
이 \3
입니다) 셀 수 있도록 \3
전에 언젠가 그것을 평가해야, 전체 덩어리로 (a(b))
를 치료하고 반복 할 수 없습니다.
다른 문제는 내가 실제로 (a(b))
, (a(b))
을 두 번 반복하면 ... 숫자를 표시 할 때 한정 기호 정보를 잃어 버렸기 때문에 두 번 계산됩니다. 내가 문자열의 목록을 유지하지 않는 한, 오히려 그것이 계산되었는지 아닌지를 나타내는 더 복잡한 구조입니다. 즉, 또는 역 참조 목록에 즉시 넣습니다 ...하지만 평가하지 않은 채로 두 번 평가해야합니다. 작동하지 않으므로 평가하기 전에 평가해야합니다. 역 참조 목록 ...
그렇다면 (a|b){2}\1
과 같은 것이 있습니까? I think\1
은 마지막 캡처를 나타냅니다. 그래서 (a|b)
을 즉시 평가할 수 없으며 정량화 될 수 있기 때문에 역 참조 목록에 결과를 던져 넣을 수 있습니다 ... 정량화 한 직후 즉시 평가할 수 있습니다.
나는 a different structure이 모든 것을 도와 줄 것이라고 생각했습니다. 하지만 여전히 한정어를 고려하는 방법을 모르겠습니다 ... 수량 한정자가 발견되면 즉시 노드를 복제하려고했으나 이것이 최선의 방법인지 확실하지 않습니다. 어쩌면 노드에 repeat-min, repeat-max 변수를 추가 할 수 있습니까?
그래서 나무 구조가 필요하다는 데 동의합니다 ... 확인. 나는 이것을 조금 가지고 놀고 내가 무엇을 생각해 낼 수 있는지 보게 될 것이다. – mpen