Regex для сопоставления четырех повторяющихся букв в строке с использованием шаблона Java - PullRequest
13 голосов
/ 12 апреля 2010

Я хочу сопоставить что-то вроде aaaa, aaaad, adjjjjk. Нечто подобное ([a-z]) \ 1+ использовалось для сопоставления повторяющихся символов, но я не могу понять это для четырех букв.

Ответы [ 4 ]

21 голосов
/ 12 апреля 2010

Вы хотите сопоставить один символ, а затем этот символ повторяется еще три раза:

([a-z])\1{3}

Примечание. В Java вам необходимо избегать обратной косой черты внутри регулярных выражений.


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

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class Program
{
    public static void main(String[] args)
    {
        Pattern pattern = Pattern.compile("([a-z])\\1{3}");
        Matcher matcher = pattern.matcher("asdffffffasdf");
        System.out.println(matcher.find());
    }
}

Результат:

true
17 голосов
/ 12 апреля 2010

Не зная о синтаксисе конечных повторений, ваш собственный навык решения проблем должен привести вас к этому:

([a-z])\1\1\1

Очевидно, что это не красиво, но:

  • Работает
  • Он использует ваш собственный навык решения проблем
  • Это может привести вас к более глубокому пониманию концепций
    • В этом случае, зная desugared форму синтаксиса конечного повторения

Эй, ребята, классные ответы, но у меня есть одна проблема

  • "ffffffff".matches("([a-z])\\1{3,}") = true
  • "fffffasdf".matches("([a-z])\\1{3,}") = false
  • "asdffffffasdf".matches("([a-z])\\1{3,}") = false

Что я могу сделать для двух последних?

Проблема в том, что в Java matches должно соответствовать всей строке; это как если бы узор был окружен ^ и $.

К сожалению, String.containsPattern(String regex), к сожалению, нет, но вы всегда можете использовать этот трюк, заключающийся в окружении шаблона .*:

"asdfffffffffasf".matches(".*([a-z])\\1{3,}.*") // true!
//                         ^^              ^^
6 голосов
/ 12 апреля 2010

Вы можете поставить {n} после чего-то, чтобы соответствовать n раз, поэтому:

([a-z])\1{3}
3 голосов
/ 12 апреля 2010

Общий шаблон регулярных выражений для предопределенного повторения: {4}.

Таким образом, здесь ([a-z]) \ 1 {3} должно соответствовать вашим 4 символам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...