Java重复了条件为

时间:2016-05-09 13:57:32

标签: java regex repeat

我有大型数据库。我想检查我的数据库大写错误。我将这种模式用于重复的字符。模式有效但我需要用字符串开始和结束条件。

模式:

(\w)\1+

目标字符串:

Javaaa

结果: aaa

我想为正则表达式添加条件;从 Ja 开始,以 a *结束。结果**只能重复字符。

  

(我不想以编程方式控制只有正则表达式才能执行此操作

     

(我是这样做的String.replaceAll(regex, string)不是   Pattern or Matcher类)

2 个答案:

答案 0 :(得分:2)

您可以使用锚定在前导词边界的前瞻:

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

请参阅regex demo

详细说明:

  • \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 demo

答案 1 :(得分:1)

根据您预期的输入和输出格式的另一个代码示例(灵感来自@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