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

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

Linda Hamilton
Linda Hamilton원래의
2024-10-31 09:28:29656검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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