[java] Java Regex에서 matches ()와 find ()의 차이점

나는 차이를 이해하려고 matches()하고 find().

Javadoc에 따르면 (내가 이해 한 바에 따르면) matches()찾고있는 것을 찾더라도 전체 문자열을 검색하고 찾고있는 find()것을 찾으면 중지합니다.

그 가정이 맞다면, 찾은 일치 수를 계산하지 않으면을 matches()대신 사용하려고 할 때마다 볼 수 없습니다 find().

내 생각에 String 클래스는 내장 메소드 find()대신에 있어야합니다 matches().

요약하면 다음과 같습니다.

  1. 내 가정이 맞습니까?
  2. matches()대신에 사용 하는 것이 언제 유용한 find()가요?


답변

matches표현식을 전체 문자열과 비교하고 패턴 ^의 시작과 $끝에 암시 적으로 a 를 추가하려고 시도합니다 . 즉, 하위 문자열을 찾지 않습니다. 따라서이 코드의 출력 :

public static void main(String[] args) throws ParseException {
    Pattern p = Pattern.compile("\\d\\d\\d");
    Matcher m = p.matcher("a123b");
    System.out.println(m.find());
    System.out.println(m.matches());

    p = Pattern.compile("^\\d\\d\\d$");
    m = p.matcher("123");
    System.out.println(m.find());
    System.out.println(m.matches());
}

/* output:
true
false
true
true
*/

123의 하위 문자열 a123b이므로 find()메소드가 true를 출력합니다. 동일하지 않은 matches()‘보는 것’만으로 거짓을 출력합니다.a123b123


답변

matches전체 문자열이 주어진 패턴과 일치하면 true를 반환합니다. find패턴과 일치하는 부분 문자열을 찾으려고합니다.


답변

matches()전체 문자열이 일치하는 경우에만 true를 반환합니다.
하위 문자열 내에서 정규 표현식과 일치하는 다음 항목 find()을 찾으려고 시도합니다 . “다음”에 중점을 둡니다. 즉, 여러 번 호출 한 결과가 동일하지 않을 수 있습니다. 또한을 사용 하여 하위 문자열이 일치 한 위치를 반환하도록 호출 할 수 있습니다 .find()find()start()

final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());

System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());

출력합니다 :

발견 : 거짓
발견 : 사실-위치 4
발견 : 참-위치 17
발견 : 사실-위치 20
발견 : 거짓
발견 : 거짓
일치 : 거짓
-----------
발견 : true-위치 0
발견 : 거짓
발견 : 거짓
일치 : true
일치 : true
일치 : true
일치 : true

호출 할 때,주의 find()경우 여러 번 Matcher개체가 초기화되지 않은 정규식이 둘러싸여 경우에도, ^그리고 $전체 문자열과 일치 할 수 있습니다.


답변

find()matches()완전한 표현을 고려할 때 정규 표현식에 대해 부분 문자열 을 고려합니다.

find() 식의 하위 문자열이 패턴과 일치하는 경우에만 true를 반환합니다.

public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d");
        String candidate = "Java123";
        Matcher m = p.matcher(candidate);

        if (m != null){
            System.out.println(m.find());//true
            System.out.println(m.matches());//false
        }
    }


답변

matches();버퍼링하지 않고 find()버퍼링합니다. find()문자열의 끝까지 먼저 검색하여 결과를 색인화하고 부울 값과 해당 색인을 리턴합니다.

그래서 당신이 같은 코드를 가질 때

1:Pattern.compile("[a-z]");

2:Pattern.matcher("0a1b1c3d4");

3:int count = 0;

4:while(matcher.find()){

5:count++: }

에서 4 : 의해 지정된 코드 인덱스 (인덱스의 전체를 읽을 패턴 구조를 사용하는 정규식 엔진 regex[single character]. 같은 일치하는 항목이 발견되면 그 다음 색인이 될 것이다 적어도 하나의 일치를 찾기 위해 루프를 기반으로 실행됩니다 그것은 앞서 계산을하지 않았다 다른 경우 이는 같은 인덱스 결과는 matches(),하지 않는 일치하는 문자열의 첫 번째 문자는 알파벳이 아니기 때문에 문이 실행되지 않을 것입니다 동안..


답변