욕심, 꺼림, 소유의 차이
예시
위의 표를 보면 , 우리는 세 수량자의 의미가 동일하다는 것을 알 수 있습니다(예를 들어 X?, X?? 및 X?+는 모두 한 번 또는 한 번이 아님을 의미함). 그러나 이들 사이에는 여전히 미묘한 차이가 있습니다. 먼저 예를 살펴보겠습니다.
1.Greedy
public static void testGreedy() { Pattern p = Pattern.compile(".*foo"); String strText = "xfooxxxxxxfoo"; Matcher m = p.matcher(strText); while (m.find()) { System.out.println("matched form " + m.start() + " to " + m.end()); } }
결과:
form 0 ~ 13
2.Reluctant
public static void testReluctant() { Pattern p = Pattern.compile(".*?foo"); String strText = "xfooxxxxxxfoo"; Matcher m = p.matcher(strText); while (m.find()) { System.out.println("matched form " + m.start() + " to " + m.end()); } }
결과:
형식 0~4 일치
형식 4~13 일치
소유형
public static void testPossessive() { Pattern p = Pattern.compile(".*+foo"); String strText = "xfooxxxxxxfoo"; Matcher m = p.matcher(strText); while (m.find()) { System.out.println("matched form " + m.start() + " to " + m.end()); } }
결과:
//매칭 성공
원리 설명
매처가 입력 문자열을 처음 시도할 때 전체 일치 항목을 읽어야 하기 때문에 Greedy 수량자를 "greedy"라고 합니다. 첫 번째 일치 시도가 실패하면 문자별로 뒤에서 앞으로 돌아가서 일치가 성공하거나 돌아갈 문자가 없을 때까지 다시 일치를 시도합니다.
패턴 문자열: .*foo
검색 문자열: xfooxxxxxxfoo
결과: 0~13 형식 일치
비교 과정은 다음과 같습니다
Reluctant는 Greedy와 반대되는 방법을 사용합니다. 입력 문자열의 첫 번째(문자) 위치부터 시작하여 전체를 완료하려고 시도할 때까지 일치 검색에서 마지 못해 한 문자만 읽습니다. 끈.
패턴 문자열: .*foo
검색 문자열: xfooxxxxxxfoo
결과: 형식 0~4와 일치
형식 4~13과 일치
비교 과정은 다음과 같습니다
소유 수량자는 항상 전체 입력 문자열을 읽고 한 번(한 번만) 일치를 시도하여 성공적으로 일치합니다. . 그렇게 해도 전체 경기가 성공할 수 있습니다.
패턴 문자열: .*foo
검색 문자열: xfooxxxxxxfoo
결과:
//Unmatched 성공적으로
비교 프로세스 다음
참고 기사: http://docs.oracle.com/javase/tutorial/essential/regex/Quant.html
한 번 살펴보겠습니다. 예:
패턴 문자열: .+[0-9]
검색 문자열: abcd5aabb6
결과: 0~10 형식 일치
패턴 문자열: .+?[0-9]
검색 문자열: abcd5aabb6
결과: 형식 0~4 일치
패턴 문자열: .{1,9}+[0-9]
검색 문자열: abcd5aabb6
결과: 0~10 형식과 일치
패턴 문자열: .{1,10}+[0-9]
검색 문자열: abcd5aabb6
결과: 일치 실패