Это работает, если у вас есть объект Activity (который нужно запустить):
intent.setClassName(CallingActivity.this, activityToLaunch.getComponentName().getClassName());
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.
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
возвращает true, если вся строка соответствует заданному шаблону. find
пытается найти подстроку, которая соответствует шаблону.
matches(p)
совпадает с find("^" + p + "$")
, если это более понятно.
– jensgram
15 December 2010 в 13:56
"123abc123".matches("[a-z]+")
выйдет так же, как "123abc123".find("^[a-z]+$")
. Моя точка зрения заключалась в том, что matches()
подходит для полного соответствия, так же как find()
как с начальными, так и с концевыми якорями.
– jensgram
15 December 2010 в 13:59
Pattern.compile("some pattern").matcher(str).matches()
равно Pattern.compile("^some pattern$").matcher(str).find()
– AlexR
15 December 2010 в 14:09
...("some pattern").matcher(str).matches()
является not i>, в точности равным ...("^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
не был сброшен, даже когда регулярное выражение окружено с ^
и $
, чтобы соответствовать полной строке.
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 никогда не будет выполняться, так как первый символ совпадающей строки не является алфавитом.
matchers()
не простоfind()
с подразумеваемыми окружающими ^ и $. Помните, что вызов.find()
более одного раза может иметь разные результаты, если не предшествоватьreset()
, тогда какmatches()
всегда будет возвращать тот же результат. См. Мой ответ ниже. – L. Holanda 20 November 2015 в 23:35