RegEx:两个字母重复两次的单词(例如ABpoiuyAB,xnvXYlsdjsdXYmsd)

时间:2013-03-24 15:05:55

标签: regex

今天我有两个正则表达式的任务 - 我正确地完成了一个并且失败了。 第一个任务是在一个长而长的文本中找到所有以“F”开头并以元音结尾的单词:

(\bf)\w*([euioay]\b)

它完美无缺。

第二个对于语言学生来说太难了;-) 我必须找到重复至少两次双字母序列的所有单词,例如:

  • tatarak是TATArak,“TA”两次;
  • brzozowski是brZOZOwski,“ZO”两次;
  • loremipsrecdks是loREmipsREcdks,“RE”两次;
我可以帮忙吗?提前谢谢; - )

3 个答案:

答案 0 :(得分:4)

让我们看看:

(\w{2})匹配两个字母(或数字/下划线,但让我们忽略它)并在组号1中捕获它们。然后\1匹配该组匹配的任何内容。所以

\b\w*(\w{2})\w*\1

是你正在寻找的东西(你不需要{2,},因为如果重复三个字母,也会重复两个字母。不检查两个字母会使正则表达式更有效率。你可以停止\1反向引用成功后的匹配。

答案 1 :(得分:2)

这种模式应该做的伎俩

\b\w*?(\w{2})\w*?\1\w*?\b
  • \b是一个单词边界
  • \w*?一些字母(懒洋洋地)
  • (w{2})正好两个字母,匹配和捕获
  • \w*?与上述相同
  • \1我们的双字母捕获小组的内容
  • \w*?与上述相同
  • \b另一个词边界

java中的快速测试:

public static void main(String[] args) {
   final Pattern pattern = Pattern.compile("\\b\\w*?(\\w{2})\\w*?\\1\\w*?\\b");
   final String string = "tatarak brzozowski loremipsrecdks a word that does not match";
   final Matcher matcher = pattern.matcher(string);
   while(matcher.find()) {
       System.out.println("Found group " + matcher.group(1) + " in word " + matcher.group());
   }
}

输出

Found group ta in word tatarak
Found group zo in word brzozowski
Found group re in word loremipsrecdks

答案 2 :(得分:0)

试试:\b\w*?(\w{2})\w*?\1\w*\b