如何使用Java Regex查找带有字母的单词

时间:2019-06-28 14:08:51

标签: 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

我已经在上面粗心地尝试过此正则表达式,并认为这也是错误的。

1 个答案:

答案 0 :(得分:1)

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

字符类[aA],字符类[a-z[n]+。然后是a-z]*,它将与重复进行0次以上的a-z]相匹配。

例如匹配Abendessena-z]

您可能要做的是以a或A开始比赛,并重复2次[a-z] 0次以上,并确保中间有n

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

说明

  • \b字边界
  • [aA]匹配a或A
  • [a-z]*匹配a + z超过0次
  • n匹配n
  • [a-z]*匹配a + z超过0次
  • \b字边界

您还可以使用锚点^$来声明字符串的开头和结尾,而不是\b

Regex demo