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