> Java > java지도 시간 > 본문

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

Barbara Streisand
풀어 주다: 2024-10-31 02:51:31
원래의
805명이 탐색했습니다.

Why does String.replaceAll(

String.replaceAll(regex) 일치 동작

String.replaceAll(".*", "a") 결과에 대한 흥미로운 관찰 "aa"는 .* 정규식의 특성에 대한 질문을 제기합니다.

Matching Anything

.*은 모든 문자 시퀀스, 심지어 빈 문자열과도 일치합니다. 따라서 첫 번째 일치 항목은 전체 입력 문자열을 포함하므로 정규식 엔진은 끝부터 후속 일치 항목을 검색합니다.

그러나 .*는 입력 끝의 빈 문자열과도 일치할 수 있습니다. 따라서 두 번째 일치 항목을 찾아 "a"로 대체하여 "aa" 결과를 얻습니다.

. 및 .replaceFirst()

이 동작을 방지하려면 . 대신, 일치하려면 최소한 하나의 문자가 필요합니다. 또는 .replaceFirst()를 사용하여 첫 번째 발생으로 교체를 제한합니다.

행동 설명

.*가 빈 문자열과 일치한다는 사실은 독특하며 더 깊이 탐구할 가치가 있습니다. . 대부분의 정규식 엔진과 달리 Java의 정규식 엔진은 .*와 두 번째 일치 후 입력에서 한 문자 더 이동합니다. 이러한 편차는 다음 그림에서 분명하게 드러납니다.

<code class="text"># Before first run
regex: |.*
input: |whatever
# After first run
regex: .*|
input: whatever|
# Before second run
regex: |.*
input: whatever|
# After second run: since .* can match an empty string, it is satisfied...
regex: .*|
input: whatever|
# However, this means the regex engine matched an empty input.
# All regex engines, in this situation, will shift
# one character further in the input.
# So, before third run, the situation is:
regex: |.*
input: whatever<|ExhaustionOfInput>
# Nothing can ever match here: out</code>
로그인 후 복사

그러나 GNU sed와 같은 다른 정규식 엔진은 첫 번째 일치 후에 입력이 소진된 것으로 간주한다는 점에 주목할 가치가 있습니다.

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

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