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


249

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

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

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

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

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

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

2
find()여러 번 호출 하면 동일한 결과가 다르게 나타날 수 있습니다 Matcher. 아래 답변을 참조하십시오.
L. Holanda

답변:


300

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


25
이 답변은 잘못된 것입니다. 암시 적으로 주변에 ^와 $ matchers()가있는 것은 아닙니다 find(). 통화주의하십시오 .find()덧붙일하지 않을 경우 두 번 이상하면 다른 결과가있을 수 reset()있지만, matches()항상 같은 결과를 반환합니다. 아래 답변을 참조하십시오.
L. Holanda

80

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


35
당신은 그것이 더 명확한 것처럼 matches(p)동일 하다고 말할 수 find("^" + p + "$")있습니다.
jensgram

4
"123azc123"문자열을 가진 "[az] +"는 matches ()를 사용할 수 없지만 find ()를 사용하면 성공합니다.
bezmax

3
@Max 정확히 "123abc123".matches("[a-z]+")처럼 실패 할 것이다 "123abc123".find("^[a-z]+$")것입니다. 내 요점은 시작 및 끝 앵커와 matches()마찬가지로 완벽하게 일치 한다는 것입니다 find().
jensgram

5
Pattern.compile("some pattern").matcher(str).matches()동일하다Pattern.compile("^some pattern$").matcher(str).find()
AlexR

3
@AlexR / @jensgram은 : ...("some pattern").matcher(str).matches()되어 있지 정확히 같음 ...("^some pattern$").matcher(str).find()첫 번째 호출 만 사실 그의. 아래 답변을 참조하십시오.
L. Holanda

62

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개체가 초기화되지 않은 정규식이 둘러싸여 경우에도, ^그리고 $전체 문자열과 일치 할 수 있습니다.


2
매우 유용한 친구
DockYard

6

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
        }
    }

3

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(),하지 않는 일치하는 문자열의 첫 번째 문자는 알파벳이 아니기 때문에 문이 실행되지 않을 것입니다 동안..

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.