> Java > java지도 시간 > `String.replaceAll(\'.*\', \'a\')` 결과가 \'a\' 대신 \'aa\'가 되는 이유는 무엇입니까?

`String.replaceAll(\'.*\', \'a\')` 결과가 \'a\' 대신 \'aa\'가 되는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-31 09:28:29
원래의
780명이 탐색했습니다.

Why does `String.replaceAll(

String.replaceAll() 이중 대체 예외 이해

다음 코드가 왜 필요한지에 대한 질문이 생깁니다.

<code class="java">System.out.println("test".replaceAll(".*", "a"));</code>
로그인 후 복사

예상된 "a" 대신 "aa"가 반환됩니다. 이 예외는 ".*$"를 사용할 때도 발생합니다.

원인:

이 예외는 ".*" 정규식의 특성으로 인해 발생합니다. 빈 문자열을 포함하여 모든 문자 시퀀스와 일치합니다. 따라서:

  • 첫 번째 일치: “.*”는 전체 문자열 "test"와 일치하고 이를 "a."로 바꿉니다.
  • 두 번째 일치 : ".*"는 입력 끝에서 찾는 빈 문자열과도 일치할 수 있습니다. 이 두 번째 일치는 빈 ​​문자열을 "a"로 대체하여 이중 대체를 초래합니다.

해결책:

이 문제를 방지하려면 다음을 사용하는 것이 좋습니다.

  • .replaceFirst(): 첫 번째 항목만 교체하여 이중 교체를 방지합니다.
  • . : 빈 문자열을 제외하고 하나 이상의 문자로 구성된 모든 문자 시퀀스와 일치합니다.

정규식 동작:

.*는 빈 문자열과 일치할 수 있습니다. , 두 번 이상 일치할 수 없습니다. 그 이유는 다음과 같습니다.

  • 첫 번째 일치 후 정규 표현식 엔진이 한 문자 앞으로 이동합니다.
  • 두 번째 일치에서는 .*를 사용하여 현재 끝에 있는 빈 문자열과 일치합니다.
  • 정규식 엔진은 입력을 모두 소모하고 다른 문자를 앞으로 이동합니다.
  • 일치할 .*에 대한 입력이 더 이상 없으므로 세 번째 대체가 불가능합니다.

위 내용은 `String.replaceAll('.*', 'a')` 결과가 'a' 대신 'aa'가 되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿