首页 > 解决方案 > 如何使用 Java Regex 查找具有给定字母的单词

问题描述

public class Homework {

  public static void main(String[] args) {

    String words[] = { "Abendessen", "Affe", "Affen", "aber", "anders", "Attacke", "arrangieren", "Art", "Asien",
            "Bund", "Arten", "Biene", "Abend", "baden", "suchen", "A1rten", "Abend-Essen" };

    Pattern pattern = Pattern.compile("[aA][a-z[n]+a-z]*");

    for (int i = 0; i < words.length; i++) {
      Matcher matcher = pattern.matcher(words[i]);
      if (matcher.find()) {
        System.out.println("OK: " + words[i]);
      }
    }
  }
}

过滤以 a 或 A 开头并在单词中包含 n 的单词。这些单词可能只由字母组成,并且只有以第二个字母开头的小写字母。这些词应该匹配:Abendessen, Affen, anders, arrangieren, Asien, Arten, Abend

我不小心尝试了上面的这个正则表达式,并认为这也是错误的。

标签: javaregex

解决方案


您当前的模式[aA][a-z[n]+a-z]*如下:

人物课[aA],人物课[a-z[n]+。然后a-z]*它会匹配一个a, -,z]重复 0+ 次。

这将例如匹配Abendessena-z]

您可能会做的是以 a 或 A 开始匹配并重复 2 次[a-z]0+ 次,并确保n中间有 a:

\b[aA][a-z]*n[a-z]*\b

解释

  • \b字边界
  • [aA]匹配一个或一个
  • [a-z]*匹配 0+ 次 az
  • n匹配n
  • [a-z]*匹配 0+ 次 az
  • \b字边界

您也可以使用锚点^$断言字符串的开头和结尾,而不是\b

正则表达式演示


推荐阅读