由来

在文本处理中,正则表达式几乎是全能的,但是Java的正则表达式有时候处理一些事情还是有些繁琐,所以我封装了部分常用功能。就比如说我要匹配一段文本中的某些部分,我们需要这样做:

  1. String content = "ZZZaaabbbccc中文1234";
  2. Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
  3. Matcher matcher = pattern.matcher(content);
  4. if (matcher.find()) {
  5. String result= matcher.group();
  6. }

其中牵涉到多个对象,想用的时候真心记不住。好吧,既然功能如此常用,我就封装一下:

  1. /**
  2. * 获得匹配的字符串
  3. *
  4. * @param pattern 编译后的正则模式
  5. * @param content 被匹配的内容
  6. * @param groupIndex 匹配正则的分组序号
  7. * @return 匹配后得到的字符串,未匹配返回null
  8. */
  9. public static String get(Pattern pattern, String content, int groupIndex) {
  10. Matcher matcher = pattern.matcher(content);
  11. if (matcher.find()) {
  12. return matcher.group(groupIndex);
  13. }
  14. return null;
  15. }
  16. /**
  17. * 获得匹配的字符串
  18. *
  19. * @param regex 匹配的正则
  20. * @param content 被匹配的内容
  21. * @param groupIndex 匹配正则的分组序号
  22. * @return 匹配后得到的字符串,未匹配返回null
  23. */
  24. public static String get(String regex, String content, int groupIndex) {
  25. Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
  26. return get(pattern, content, groupIndex);
  27. }

使用

ReUtil.extractMulti

抽取多个分组然后把它们拼接起来

  1. String content = "ZZZaaabbbccc中文1234";
  2. String resultExtractMulti = ReUtil.extractMulti("(\\w)aa(\\w)", content, "$1-$2");
  3. Assert.assertEquals("Z-a", resultExtractMulti);

ReUtil.delFirst

删除第一个匹配到的内容

  1. String content = "ZZZaaabbbccc中文1234";
  2. String resultDelFirst = ReUtil.delFirst("(\\w)aa(\\w)", content);
  3. Assert.assertEquals("ZZbbbccc中文1234", resultDelFirst);

ReUtil.findAll

查找所有匹配文本

  1. String content = "ZZZaaabbbccc中文1234";
  2. List<String> resultFindAll = ReUtil.findAll("\\w{2}", content, 0, new ArrayList<String>());
  3. // 结果:["ZZ", "Za", "aa", "bb", "bc", "cc", "12", "34"]

ReUtil.getFirstNumber

找到匹配的第一个数字

  1. Integer resultGetFirstNumber = ReUtil.getFirstNumber(content);
  2. // 结果:1234

ReUtil.isMatch

给定字符串是否匹配给定正则

  1. String content = "ZZZaaabbbccc中文1234";
  2. boolean isMatch = ReUtil.isMatch("\\w+[\u4E00-\u9FFF]+\\d+", content);
  3. Assert.assertTrue(isMatch);

ReUtil.replaceAll

通过正则查找到字符串,然后把匹配到的字符串加入到replacementTemplate中,$1表示分组1的字符串

  1. String content = "ZZZaaabbbccc中文1234";
  2. //此处把1234替换为 ->1234<-
  3. String replaceAll = ReUtil.replaceAll(content, "(\\d+)", "->$1<-");
  4. Assert.assertEquals("ZZZaaabbbccc中文->1234<-", replaceAll);

ReUtil.escape

转义给定字符串,为正则相关的特殊符号转义

  1. String escape = ReUtil.escape("我有个$符号{}");
  2. // 结果:我有个\\$符号\\{\\}