Java регулярное выражение возвращается после первого совпадения - PullRequest
3 голосов
/ 09 января 2011

как мне вернуться после первого совпадения регулярного выражения?(метод Matcher.find () делает это?)

говорит, что у меня есть строка "abcdefgeee".Я хочу попросить, чтобы регулярное выражение остановило двигатель сразу после того, как он обнаружит первое совпадение, например, "e".Я пишу метод для возврата true / false, если шаблон найден, и я не хочу найти всю строку для «e».(Я ищу решение для регулярных выражений)

Другой вопрос, иногда, когда я использую match (), он не возвращается правильно.Например, если я скомпилирую свой шаблон как «[az]».а затем использовать match (), это не совпадает.Но когда я компилирую шаблон как ".*[a-z].*", он совпадает ... это то, что поведение метода match () класса Matcher?

Edit, вот что я на самом деле хочу сделать.Например, я хочу найти знак $ И знак @ в строке.Так что я бы определил 2 скомпилированных шаблона (так как я не могу найти логическое И для регулярных выражений, так как знаю основы).

pattern1 = Pattern.compiled("$");
pattern2 = Pattern.compiled("@");

тогда я просто использовал бы

if ( match1.find() && match2.find()  ){
  return true;
}

в моем методе.

Я только хочу, чтобы сопоставители искали строку для первого вхождения и возврата.

спасибо

Ответы [ 2 ]

2 голосов
/ 09 января 2011

Для вашего второго вопроса совпадения работают правильно, в вашем примере используются два разных регулярных выражения.

.*[a-z].* будет соответствовать строке, которая имеет хотя бы один символ.[a-z] будет соответствовать только одной символьной строке в нижнем регистре az.Я думаю, что вы могли бы использовать что-то вроде [a-z]+

1 голос
/ 09 января 2011

Другой вопрос, иногда, когда я использую match (), он не возвращается правильно.Например, если я скомпилирую свой шаблон как «[az]».а затем использовать match (), это не совпадает.Но когда я компилирую шаблон как ". [az]. ", он совпадает ... Это поведение метода match () класса Matcher?

Да, matches(...) проверяет всю целевую строку.

... вот собственно то, что я хочу сделать.Например, я хочу найти знак $ И знак @ в строке.Поэтому я бы определил 2 скомпилированных шаблона (так как я не могу найти никакого логического И для регулярного выражения, поскольку я знаю основы).

Я знаю, что вы сказали, что хотите использовать регулярное выражение, но все ваши примеры кажутсяпредположить, что они вам не нужны: это все отдельные символы, которые можно обработать парой indexOf(...) вызовов.

В любом случае, используя регулярные выражения, вы можете сделать это так:

public static boolean containsAll(String text, String... patterns) {
    for(String p : patterns) {
        Matcher m = Pattern.compile(p).matcher(text);
        if(!m.find()) return false;
    }
    return true;
}

Но, опять же: indexOf(...) тоже подойдет:

public static boolean containsAll(String text, String... subStrings) {
    for(String s : subStrings) {
        if(text.indexOf(s) < 0) return false;
    }
    return true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...