>Java >java지도 시간 >Java에서 \'test\'.replaceAll(\'.\', \'a\') 결과가 \'aa\'인 이유는 무엇입니까?

Java에서 \'test\'.replaceAll(\'.\', \'a\') 결과가 \'aa\'인 이유는 무엇입니까?

DDD
DDD원래의
2024-11-01 06:07:31607검색

Why Does

문자열 바꾸기 이상: ".*"로 이중 교체

Java에서 String.replaceAll() 메서드는 전역 검색을 수행하고 정규식을 사용하여 주어진 문자열에 대한 대체 작업. 그러나 ".*" 정규식 패턴을 사용할 때 예기치 않은 동작이 발생하여 이중 교체 문제가 발생합니다.

질문은 "test".replaceAll(".", "a ") 결과로 "aa"가 생성됩니다. 그 이유는 .가 임의 개수의 문자(0 포함)와 일치하여 처음에 전체 입력 문자열을 캡처하는 탐욕적 수량자이기 때문입니다. 결과적으로 첫 번째 대체에서는 전체 문자열이 "a"로 대체됩니다.

그러나 .는 빈 문자열과도 일치할 수 있습니다. 초기 교체 후 입력 끝에 남아 있는 빈 문자열은 .에도 일치하는 것으로 간주됩니다. 따라서 두 번째 교체가 발생하여 빈 문자열을 "a"로 교체하여 최종 출력 "aa"가 됩니다.

이러한 이중 교체 문제를 방지하려면 .*에 대한 대안(예: . , 일치하려면 문자가 하나 이상 필요합니다. 또는, replacementFirst()를 사용하면 첫 번째 항목만 대체하여 빈 문자열이 두 번째로 일치하는 상황을 방지합니다.

흥미롭게도 일부 정규식 엔진은 이러한 이중 대체 동작을 나타내지 않습니다. 예를 들어, GNU sed는 첫 번째 일치 후 입력이 소진된 것으로 간주하여 추가 교체를 방지합니다. 그러나 Java에서 String.replaceAll() 메서드와 함께 ".*"를 사용할 때 이러한 잠재적인 예외를 인식하는 것이 중요합니다.

위 내용은 Java에서 \'test\'.replaceAll(\'.\', \'a\') 결과가 \'aa\'인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.