Java 프로그램의 정규 표현식 탐욕 패턴 일치 실례 해석

탐욕 모드(Greedy):
수량 표시자는 다른 표시가 없는 한 기본적으로 탐욕 모드를 사용합니다.탐욕 모드의 표현식은 일치하지 않을 때까지 계속 일치합니다.만약 표현식이 일치하는 결과가 예상과 맞지 않는다는 것을 발견한다면, 표현식이 앞의 몇 글자만 일치한다고 생각하기 때문일 가능성이 높다. 실제로는 탐욕스러운 패턴이기 때문에 계속 일치할 것이다.
탐욕과 비탐욕, 게다가?비탐욕:

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

좋은 웹페이지 즐겨찾기