Как контролировать шаг итерации в регулярном выражении Java? - PullRequest
1 голос
/ 03 декабря 2011

Тема сбивает с толку, однако, например,

final String pattern = "(abc)";

final String content = "dabcef";

Matcher m = Pattern.compile(pattern).matcher(content);

m.find () обязательно вернет true.

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

"dab" -> не найдено, "cef" -> не найдено, окончено.

Спасибо!

РЕДАКТИРОВАТЬ:

На самом деле яхотите найти все совпадения, а не только проверять совпадения или нет.Например,

abc abc def abc dab cef (фактически без пробелов)

будет соответствовать ^ (. {3}) *? (Abc), но только один раз.И я ожидаю 3 матча.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 03 декабря 2011

Как насчет:

final String pattern = "^(.{3})*(abc)";
0 голосов
/ 04 декабря 2011

Я нашел решение, переместив стартовый индекс.Спасибо @Oil за предложение!

public static void main(String[] args) {
    final String pattern1 = "^(.{3})*?(abc)";

    final String content1 = "efabcabcdabcefaabcdfabce"; // two matches

    final String content2 = "abcabcdabcefabc"; // three matches

    Matcher mStart = Pattern.compile(pattern1).matcher(content1);

    while (mStart.find()) {
        System.out.println(mStart.group(mStart.groupCount()));
        System.out.println(mStart.start() + ", " + mStart.end());

        mStart = mStart.region(mStart.end(), mStart.regionEnd());
    }

    //-----------------------------
    System.out.println("------------------------");

    mStart = Pattern.compile(pattern1).matcher(content2);

    while (mStart.find()) {
        System.out.println(mStart.group(mStart.groupCount()));
        System.out.println(mStart.start() + ", " + mStart.end());

        mStart = mStart.region(mStart.end(), mStart.regionEnd());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...