Повторяющееся символьное выражение Java с условием

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

Шаблон:

(\w)\1+

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

Javaaa

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

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

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

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


person kibar    schedule 09.05.2016    source источник
comment
ты имеешь в виду это? \\bJa\\w*(\\w)\\1+\\w*a\\b   -  person Avinash Raj    schedule 09.05.2016
comment
этот результат регулярного выражения выбирает все. У этого есть условие, но результат должен быть aaa, если целевая строка Prooo и регулярное выражение \\bPro\\w*(\\w)\\1+\\w*o\\b, тогда результат должен быть ooo. Ваше слово результата регулярного выражения all   -  person kibar    schedule 09.05.2016
comment
захватить повторяющуюся часть, \\bJa\\w*((\\w)\\2+)\\w*a\\b   -  person Avinash Raj    schedule 09.05.2016


Ответы (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.

person Wiktor Stribiżew    schedule 09.05.2016
comment
Я не хочу этого, потому что у меня большой список заглавных букв, много регулярных выражений, и я использую методы String.replaceAll (regex, string). Например, в моем списке: [ ]{1,}[.]{1,}[ ]{1,}###. (### разделитель). - person kibar; 09.05.2016
comment
В чем тогда беда? Замените на $1. Струны стоят отдельно? Если это так, просто используйте ^ вместо границы начального слова и $ вместо границы конечного слова. См. эту демонстрацию. - person Wiktor Stribiżew; 09.05.2016
comment
Да автономный. Например, я хочу это; В слове Javaaa после регулярного выражения Java, если слово Prooo после регулярного выражения Pro. Если слово Theee не делает ничего. Я хочу, чтобы только вы сделали слова, которые я установил с помощью методов String.replaceAll(regex, string). - person kibar; 09.05.2016
comment
Потрясающе спасибо. Наконец, String s = "Javaaa" методы String.replaceAll() после результата: Java с вашим регулярным выражением возможно ли это? - person kibar; 09.05.2016
comment
Ну, я не уверен, что вам нужно. Пожалуйста, сообщите, какие переменные известны. - person Wiktor Stribiżew; 09.05.2016
comment
Ваша демо-ссылка в стандартном выводе: Java не ааа, возможно ли это? Но регулярное выражение должно иметь start Ja end условия :) - person kibar; 09.05.2016
comment
Вывод aaa, вы хотите, чтобы он был Java? Нравится это? - person Wiktor Stribiżew; 09.05.2016

Другой пример кода (вдохновленный кодом @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
person Mahendra    schedule 09.05.2016
comment
Я не хочу этого, потому что у меня большой список заглавных букв, много регулярных выражений, и я использую методы String.replaceAll (regex, string). Например, в моем списке: [ ]{1,}[.]{1,}[ ]{1,}###. (### разделитель). - person kibar; 09.05.2016