Смутно об использовании группы (int), а не find (), тогда group () [duplicate]

Это работает, если у вас есть объект Activity (который нужно запустить):

intent.setClassName(CallingActivity.this, activityToLaunch.getComponentName().getClassName());
192
задан evandrix 17 February 2016 в 07:24
поделиться

5 ответов

matches пытается сопоставить выражение со всей строкой и неявно добавить ^ в начале и $ в конце вашего шаблона, то есть не будет искать подстроку. Следовательно, выход этого кода:

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() только «видит» a123b, который не совпадает с 123 и, следовательно, выводит false.

246
ответ дан Jonathan 15 August 2018 в 23:31
поделиться
  • 1
    Этот ответ вводит в заблуждение. matchers() не просто find() с подразумеваемыми окружающими ^ и $. Помните, что вызов .find() более одного раза может иметь разные результаты, если не предшествовать reset(), тогда как matches() всегда будет возвращать тот же результат. См. Мой ответ ниже. – L. Holanda 20 November 2015 в 23:35

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
ответ дан Jaap 15 August 2018 в 23:31
поделиться

matches возвращает true, если вся строка соответствует заданному шаблону. find пытается найти подстроку, которая соответствует шаблону.

63
ответ дан khachik 15 August 2018 в 23:31
поделиться
  • 1
    Можно сказать, что matches(p) совпадает с find("^" + p + "$"), если это более понятно. – jensgram 15 December 2010 в 13:56
  • 2
    Просто пример, поясняющий ответ: & quot; [a-z] + & quot; со строкой "123abc123" не удастся использовать match (), но будет успешно использовать find (). – bezmax 15 December 2010 в 13:57
  • 3
    @Max Точно, "123abc123".matches("[a-z]+") выйдет так же, как "123abc123".find("^[a-z]+$"). Моя точка зрения заключалась в том, что matches() подходит для полного соответствия, так же как find() как с начальными, так и с концевыми якорями. – jensgram 15 December 2010 в 13:59
  • 4
    Pattern.compile("some pattern").matcher(str).matches() равно Pattern.compile("^some pattern$").matcher(str).find() – AlexR 15 December 2010 в 14:09
  • 5
    @AlexR / @jensgram: ...("some pattern").matcher(str).matches() является not , в точности равным ...("^some pattern$").matcher(str).find(), что истинно только в первом вызове. См. Мой ответ ниже. – L. Holanda 11 August 2016 в 17:55

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());

Будет выводиться:

Found: false
Found: true - position 4
Found: true - position 17
Found: true - position 20
Found: false
Found: false
Matched: false
-----------
Found: true - position 0
Found: false
Found: false
Matched: true
Matched: true
Matched: true
Matched: true

Итак, будьте осторожны при многократном вызове find(), если объект Matcher не был сброшен, даже когда регулярное выражение окружено с ^ и $, чтобы соответствовать полной строке.

37
ответ дан L. Holanda 15 August 2018 в 23:31
поделиться

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], чтобы найти хотя бы одно совпадение. Если такое совпадение найдено, оно будет проиндексировано, тогда цикл будет выполняться на основе индексированного результата else, если он не выполнил вычисления, как matches(); Оператор while никогда не будет выполняться, так как первый символ совпадающей строки не является алфавитом.

2
ответ дан user 15 August 2018 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: