У меня большая база данных. Я хочу проверить свою базу данных на наличие ошибок. Я использую этот шаблон для повторяющихся символов. Шаблон работает, но мне нужно начать и закончить условие со строкой.

Шаблон:

(\w)\1+

Целевая строка:

Javaaa

Результат: ааа

Я хочу добавить условие в регулярное выражение ; Начните с Ja и закончите a *. Результат ** должен содержать только символы.

(Я не хочу программно управлять только регулярным выражением, если это возможно

(Я делаю это с String.replaceAll(regex, string), чтобы не Pattern or Matcher класс)

1
kibar 9 Май 2016 в 16:57

2 ответа

Лучший ответ

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

\b(?=Ja\w*a\b)\w*?((\w)\2+)\w*\b

См. демонстрацию регулярного выражения

Детали:

  • \b - граница ведущего слова
  • (?=Ja\w*a\b) - положительный просмотр вперед, при котором все слово должно начинаться с Ja, затем оно может содержать более 0 символов и заканчиваться на a
  • \w*? - 0+ словосочетаний, но как можно меньше
  • ((\w)\2+) - Группа 1, в которой совпадают одинаковые последовательные символы
  • \w* - любые оставшиеся символы слова (0 или более)
  • \b - конечная граница слова.

Результат, который вы ищете, находится в группе 1.

String s = "Prooo\nJavaaa";
Pattern pattern = Pattern.compile("\\b(?=Ja\\w*a\\b)\\w*?((\\w)\\2+)\\w*\\b");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 

См. демонстрацию Java.

2
Wiktor Stribiżew 9 Май 2016 в 14:12

Другой пример кода (вдохновленный кодом @Wiktor Stribizew) в соответствии с ожидаемым форматом ввода и вывода.

public static void main( String[] args )
{
    String[] input =
        { "Javaaa", "Javaaaaaaaaa", "Javaaaaaaaaaaaaaaaaaa", "Paoooo", "Paoooooooo", "Paooooooooxxxxxxxxx" };
    for ( String str : input )
    {

        System.out.println( "Target String :" + str );
        Pattern pattern = Pattern.compile( "((.)\\2+)" );
        Matcher matcher = pattern.matcher( str );
        while ( matcher.find() )
        {
            System.out.println( "result: " + matcher.group() );
        }
        System.out.println( "---------------------" );
    }
    System.out.println( "Finish" );
}

Вывод:

Target String :Javaaa
result: aaa
---------------------
Target String :Javaaaaaaaaa
result: aaaaaaaaa
---------------------
Target String :Javaaaaaaaaaaaaaaaaaa
result: aaaaaaaaaaaaaaaaaa
---------------------
Target String :Paoooo
result: oooo
---------------------
Target String :Paoooooooo
result: oooooooo
---------------------
Target String :Paooooooooxxxxxxxxx
result: oooooooo
result: xxxxxxxxx
---------------------
Finish
1
Mahendra 9 Май 2016 в 14:32