Регулярное выражение для сопоставления четырех повторяющихся букв в строке с использованием шаблона Java

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


person Anonymous user    schedule 12.04.2010    source источник
comment
Привет, ребята, классные ответы, но у меня есть одна проблема ffffffff.matches(([az])\\1{3,}) = true fffffasdf.matches(([az])\\1{3,}) = false asdffffffasdf.matches (([az])\\1{3,}) = false что я могу сделать для двух нижних?   -  person Anonymous user    schedule 12.04.2010


Ответы (4)


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

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

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

  • Оно работает
  • Это тренирует ваш собственный навык решения проблем
  • It may lead you to deeper understanding of concepts
    • In this case, knowing the desugared form of the finite repetition syntax

У меня есть опасения:

  • "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!
//                         ^^              ^^
person polygenelubricants    schedule 12.04.2010
comment
Если вы пытаетесь сопоставить строку, в которой искомая строка находится непосредственно перед символом конца строки, приведенный выше шаблон не будет соответствовать. (Я узнал это на собственном горьком опыте!). Вы можете сделать: 'asdfffffffffasf.matches(.*([a-z])\\1{3,}(?s).*)', где '(?s)' запускает сопоставление символов конца строки. - person seinecle; 11.03.2013
comment
лучше всего найти повторяющийся символ. - person Brownsoo Han; 02.02.2017
comment
Я искал это с последних 2 часов. Спасибо большое - person Parth Bhoiwala; 29.01.2018

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

([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
person Mark Byers    schedule 12.04.2010

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

([a-z])\1{3}
person Michael Mrozek    schedule 12.04.2010

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

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

person instanceof me    schedule 12.04.2010