Java 带条件的重复字符正则表达式

Java repeated character regex with condition

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

模式:

(\w)+

目标字符串:

Javaaa

结果:aaa

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

(I dont want to control programmatically only regex do this if its possible

(I'm do this with String.replaceAll(regex, string) not to Pattern or Matcher class)

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

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

regex demo

详情:

  • \b - 前导词边界
  • (?=Ja\w*a\b) - 要求整个单词以 Ja 开头的积极前瞻,然后它可以有 0+ 个单词字符并以 a
  • 结尾
  • \w*? - 0+字字符但尽可能少
  • ((\w)+) - 第 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

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