我有大型数据库。我想检查我的数据库大写错误。我将这种模式用于重复的字符。模式有效但我需要用字符串开始和结束条件。
模式:
(\w)\1+
目标字符串:
Javaaa
结果: aaa
我想为正则表达式添加条件;从 Ja 开始,以 a *结束。结果**只能重复字符。
(我不想以编程方式控制只有正则表达式才能执行此操作
(我是这样做的
String.replaceAll(regex, string)
不是Pattern or Matcher
类)
答案 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