总结java正则常用的用法和示例。

基础

是否符合规则

  1. // 电话号码匹配
  2. // 手机号段只有 13xxx 15xxx 18xxxx 17xxx
  3. System.out.println("18304072984".matches("1[3578]\\d{9}")); // true

正则替换、过滤

  1. /**
  2. * 保留中文、英文、下划线
  3. * [^\u4e00-\u9fa5^a-z^A-Z^0-9^_]
  4. * @param name 姓名
  5. * @return 过滤后的字符串
  6. */
  7. public static String filterName(String name) {
  8. return name.replaceAll("[^\u4e00-\u9fa5a-zA-Z0-9_]", "_");
  9. }

你好12——_hhh+你

你好12__hhh

分组匹配

普通分组

  1. // 这个正则表达式有两个组,
  2. // group(0) \\$\\{([^{}]+?)\\}
  3. // group(1) ([^{}]+?)
  4. String regex = "\\$\\{([^{}]+?)\\}";
  5. Pattern pattern = Pattern.compile(regex);
  6. String input = "${name}-babalala-${age}-${address}";
  7. Matcher matcher = pattern.matcher(input);
  8. System.out.println(matcher.groupCount());
  9. // find() 像迭代器那样向前遍历输入字符串
  10. while (matcher.find()) {
  11. System.out.println(matcher.group(0) + ", pos: "
  12. + matcher.start() + "-" + (matcher.end() - 1));
  13. System.out.println(matcher.group(1) + ", pos: " +
  14. matcher.start(1) + "-" + (matcher.end(1) - 1));
  15. }

1 ${name}, pos: 0-6 name, pos: 2-5 ${age}, pos: 17-22

age, pos: 19-21

${address}, pos: 24-33

address, pos: 26-32

正则分组命名

  1. @Test
  2. public void testLog() {
  3. String text = "第一百四十四条的规定,判决如下: 一、被告黎飞强应于本案判……上诉于广西壮族自治区梧州市中级人民法院。 审 判 长  黄炳友 审 判 员  王 强 人民陪审员 ";
  4. List<String> pre = Arrays.asList("作如下判决:", "判决如下");
  5. // \p{Zs} 全角空格
  6. List<String> suffix = Arrays.asList("审\\s?\\p{Zs}?判\\s?\\p{Zs}?长");
  7. System.out.println(getPatternList(text, pre, suffix));
  8. }
  9. private List<String> getPatternList(String text, List<String> preList, List<String> sufList) {
  10. ArrayList<String> arrayList = new ArrayList<>();
  11. // 临时组名
  12. String groupName = "groupName";
  13. String prePatternStr = preList.stream()
  14. .map(x -> "(" + x + ")")
  15. .collect(Collectors.joining("|", "(", ")"));
  16. String sufPatternStr = sufList.stream().
  17. map(x -> "(" + x + ")")
  18. .collect(Collectors.joining("|", "(", ")"));
  19. String pattern = prePatternStr +
  20. "(?<" + groupName + ">.*?)" +
  21. sufPatternStr;
  22. System.out.println(pattern);
  23. Matcher matcher = Pattern.compile(pattern).matcher(text);
  24. while (matcher.find()) {
  25. arrayList.add(matcher.group(groupName));
  26. }
  27. return arrayList;
  28. }

示例

参考