Java 프로그램의 정규 표현식 탐욕 패턴 일치 실례 해석
수량 표시자는 다른 표시가 없는 한 기본적으로 탐욕 모드를 사용합니다.탐욕 모드의 표현식은 일치하지 않을 때까지 계속 일치합니다.만약 표현식이 일치하는 결과가 예상과 맞지 않는다는 것을 발견한다면, 표현식이 앞의 몇 글자만 일치한다고 생각하기 때문일 가능성이 높다. 실제로는 탐욕스러운 패턴이기 때문에 계속 일치할 것이다.
탐욕과 비탐욕, 게다가?비탐욕:
var s = '1023000'.match(/(\d+)(0*)/);
s
["1023000", "1023000", ""]
var s = '1023000'.match(/^(\d+)(0*)$/);
s
["1023000", "1023000", ""]
var s = '1023000'.match(/^(\d+?)(0*)$/);
s
["1023000", "1023", "000"]
var s = '1023000'.match(/(\d+?)(0*)/);
s
["10", "1", "0"]
자바 정규 표현식은 기본적으로greedy 탐욕 매칭 모드를 사용합니다. 이 유형(.*)의 가장 긴 매칭입니다. 가장 짧은 매칭이 필요하면 (.*?)억지로 일치하는 패턴이다.원리 분석:
탐욕 매칭 모드라면 정규 표현식 엔진은 문자열의 마지막까지 매칭됩니다. 매칭이false일 때
거슬러 올라가는 방식, 거꾸로 물러나서 꼴찌의 첫 번째 일치 위치를 찾고 일치 결과를 되돌려줍니다.
억지로 일치하는 모드라면, 정규 표현식 엔진은pattern의 마지막 위치에 맞는 문자와 일치하고, 한 걸음 더 뒤로가면 일치하는false를 발견하고, 되돌아오는 가장 가까운 일치하는true의 위치를 찾아 결과를 되돌려줍니다.
코드 보기:
예:
public void test51(){
String str = "aaa\"bbb\"ccc\"ddd\"eee";
System.out.println(str);
str = str.replaceAll("\"(.*)\"", "@");
System.out.println(str);
}
출력:
aaa"bbb"ccc"ddd"eee
aaa@eee
예2:
@Test
public void test52(){
String str = "aaa\"bbb\"ccc\"ddd\"eee";
System.out.println(str);
str = str.replaceAll("\"(.*?)\"", "@");
System.out.println(str);
}
출력:
aaa"bbb"ccc"ddd"eee
aaa@ccc@eee
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.