예를 들어 반 패턴을 사용하여 잘못된 결과를 실격시킬 수 있습니다. 예를 들어 "^ [^ a]"는 "c ..."입력이 "aabb"의 패턴과 일치하지 않는다고 알려줍니다.
패턴에 따라 패턴을 더 작은 패턴으로 분할하여 여러 matcher를 확인하고 사용하고 하나의 일치가 발생할 때 범위를 설정하고 다음으로 이동할 수 있습니다. 이 접근법은 효과가있을 수 있지만 패턴이 복잡하고 가변 길이 하위 파트가있을 수있는 경우 일치 항목의 일부를 자신의 코드에 다시 구현하여 결국 일치 항목의 범위를 조정하여 다소 욕심을 느끼게 할 수 있습니다. 이것의 의사 코드 일반적인 생각은 다음과 같습니다
이
boolean match(String input, Matcher[] subpatterns, int matchStart, int matchEnd){
matcher = next matcher in list;
int stop = matchend;
while(true){
if matcher.matches input from matchstart -> matchend{
if match(input, subpatterns, end of current match, end of string){
return true;
}else{
//make this match less greedy
stop--;
}
}else{
//no match
return false;
}
}
}
그런 다음 안티 패턴이 아이디어를 병합 및 안티 서브 패턴을 가질 수 및 각 서브 패턴 일치 한 후, 다음 안티 패턴을 확인 그것을 경우 당신이 실패했음을 당신과 일치시키고, 그렇지 않으면 매칭 패턴을 계속합니다. 부울 (예 : ALL_MATCHED, PARTIAL_MATCH, ANTI_PATTERN_MATCH 등) 대신 열거 형을 반환하려고 할 가능성이 높습니다.
적절한 하위 패턴을 작성하려는 실제 패턴의 복잡성에 따라/안티 패턴은 불가능하지는 않더라도 어렵습니다.
지금까지 어떤 정규 표현식을 사용 했습니까? –
그래서 이것을 바로 잡으려면 추가 사용자 입력을 기반으로 전체 문자열에서 정규식을 다시 수행하지 않고 중단 한 지점에서 '계속해서 정규식 바꾸기'를 원하십니까? 그렇다면 추가 제약 조건을 지정하지 않는 한이를 확인하면 설명 할 수있는 이유 때문에 가능하지 않습니다. – Cam
'bb' 부분을'aa (bb)'옵션으로 만드십시오. – Amarghosh