今天我有两个正则表达式的任务 - 我正确地完成了一个并且失败了。 第一个任务是在一个长而长的文本中找到所有以“F”开头并以元音结尾的单词:
(\bf)\w*([euioay]\b)
它完美无缺。
第二个对于语言学生来说太难了;-) 我必须找到重复至少两次双字母序列的所有单词,例如:
答案 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