문자열 바꾸기 이상: ".*"로 이중 교체
Java에서 String.replaceAll() 메서드는 전역 검색을 수행하고 정규식을 사용하여 주어진 문자열에 대한 대체 작업. 그러나 ".*" 정규식 패턴을 사용할 때 예기치 않은 동작이 발생하여 이중 교체 문제가 발생합니다.
질문은 "test".replaceAll(".", "a ") 결과로 "aa"가 생성됩니다. 그 이유는 .가 임의 개수의 문자(0 포함)와 일치하여 처음에 전체 입력 문자열을 캡처하는 탐욕적 수량자이기 때문입니다. 결과적으로 첫 번째 대체에서는 전체 문자열이 "a"로 대체됩니다.
그러나 .는 빈 문자열과도 일치할 수 있습니다. 초기 교체 후 입력 끝에 남아 있는 빈 문자열은 .에도 일치하는 것으로 간주됩니다. 따라서 두 번째 교체가 발생하여 빈 문자열을 "a"로 교체하여 최종 출력 "aa"가 됩니다.
이러한 이중 교체 문제를 방지하려면 .*에 대한 대안(예: . , 일치하려면 문자가 하나 이상 필요합니다. 또는, replacementFirst()를 사용하면 첫 번째 항목만 대체하여 빈 문자열이 두 번째로 일치하는 상황을 방지합니다.
흥미롭게도 일부 정규식 엔진은 이러한 이중 대체 동작을 나타내지 않습니다. 예를 들어, GNU sed는 첫 번째 일치 후 입력이 소진된 것으로 간주하여 추가 교체를 방지합니다. 그러나 Java에서 String.replaceAll() 메서드와 함께 ".*"를 사용할 때 이러한 잠재적인 예외를 인식하는 것이 중요합니다.
위 내용은 Java에서 \'test\'.replaceAll(\'.\', \'a\') 결과가 \'aa\'인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!