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
详情:
\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
我有大型数据库。我想检查我的数据库大写错误。我将这种模式用于重复的字符。模式有效,但我需要用字符串开始和结束条件。
模式:
(\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 toPattern or Matcher
class)
您可以使用锚定在前导词边界的前瞻:
\b(?=Ja\w*a\b)\w*?((\w)+)\w*\b
详情:
\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