StringReplaceAll 예외: ".*"로 이중 교체
Java에서 String.replaceAll() 메서드는 전역 검색을 수행하고 정규식을 사용하여 주어진 문자열에 대한 대체 작업. 그러나 ".*" 정규식 패턴을 사용할 때 예기치 않은 동작이 발생하여 이중 교체 문제가 발생합니다.
질문은 "test".replaceAll(".", "a ")는 결과적으로 "aa"를 생성합니다. 이는 .가 임의 개수의 문자(0 포함)와 일치하여 처음에 전체 입력 문자열을 캡처하는 욕심 많은 수량자이기 때문입니다. 결과적으로 첫 번째 대체는 전체 문자열을 "a."
로 대체합니다. 그러나 .는 빈 문자열과도 일치할 수 있습니다. 초기 교체 후 입력 끝에 남아 있는 빈 문자열은 .에도 일치하는 것으로 간주됩니다. 따라서 두 번째 교체가 발생하여 빈 문자열을 "a"로 교체하여 최종 출력 "aa"가 생성됩니다.
이 이중 교체 문제를 방지하려면 .*와 같은 대안을 고려하세요. , 일치하려면 문자가 하나 이상 필요합니다. 또는, replacementFirst()를 사용하면 첫 번째 항목만 대체되어 빈 문자열이 두 번째로 일치하는 상황을 피할 수 있습니다.
흥미롭게도 일부 정규식 엔진에서는 이러한 이중 대체 동작을 나타내지 않습니다. 예를 들어, GNU sed는 첫 번째 일치 후 입력이 소진된 것으로 간주하여 추가 교체를 방지합니다. 그러나 Java에서 String.replaceAll() 메서드와 함께 ".*"를 사용할 때 이러한 잠재적인 예외를 인식하는 것이 중요합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3