6

我今天有两个正则表达式任务要做——我做了一个正确的,另一个失败了。第一项任务是在很长很长的文本中找到所有以“F”开头并以元音结尾的单词:

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

它工作得很好。

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

  • tatarak 是 TATArak,“TA”两次;
  • brzozowski 是 brZOZOwski,“ZO”两次;
  • loremipsrecdks 是 loREmipsREcdks,“RE”两次;

请问我可以帮忙吗?提前致谢 ;-)

4

3 回答 3

7

让我们来看看:

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

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

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

于 2013-03-24T15:10:29.313 回答
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
于 2013-03-24T15:15:07.110 回答
0

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

于 2013-03-24T15:09:09.860 回答