From db42db25da9e8a1b2eb2b8cb5fa77336f43422ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=81=AByzs?= <835476090@qq.com> Date: Tue, 4 May 2021 14:55:39 +0800 Subject: [PATCH] =?UTF-8?q?ReUtil=E7=B1=BB=E6=B7=BB=E5=8A=A0delLast?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E2=9C=92=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/hutool/core/util/ReUtil.java | 42 ++++++++++++++- .../java/cn/hutool/core/util/ReUtilTest.java | 54 ++++++++++++++----- 2 files changed, 81 insertions(+), 15 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java index 15395d3fc..5cb590fce 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReUtil.java @@ -299,6 +299,46 @@ public class ReUtil { return pattern.matcher(content).replaceFirst(StrUtil.EMPTY); } + /** + * 删除匹配的最后一个内容 + * + * @param regex 正则 + * @param str 被匹配的内容 + * @return 删除后剩余的内容 + * @since 5.6.5 + */ + public static String delLast(String regex, CharSequence str) { + if (StrUtil.hasBlank(regex, str)) { + return StrUtil.str(str); + } + + final Pattern pattern = PatternPool.get(regex, Pattern.DOTALL); + return delLast(pattern, str); + } + + /** + * 删除匹配的最后一个内容 + * + * @param pattern 正则 + * @param str 被匹配的内容 + * @return 删除后剩余的内容 + * @since 5.6.5 + */ + public static String delLast(Pattern pattern, CharSequence str) { + if (null != pattern && StrUtil.isNotBlank(str)) { + String last = ""; + for (Matcher matcher = pattern.matcher(str); matcher.find(); ) { + last = matcher.group(); + } + + if (StrUtil.isNotBlank(last)){ + return StrUtil.subBefore(str, last, Boolean.TRUE) + StrUtil.subAfter(str, last, Boolean.TRUE); + } + } + + return StrUtil.str(str); + } + /** * 删除匹配的全部内容 * @@ -724,4 +764,4 @@ public class ReUtil { } return builder.toString(); } -} \ No newline at end of file +} diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java index d7efe1626..6f07e1452 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/ReUtilTest.java @@ -1,6 +1,7 @@ package cn.hutool.core.util; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.PatternPool; import org.junit.Assert; import org.junit.Test; @@ -23,7 +24,7 @@ public class ReUtilTest { String resultExtractMulti = ReUtil.extractMulti("(\\w)aa(\\w)", content, "$1-$2"); Assert.assertEquals("Z-a", resultExtractMulti); } - + @Test public void extractMultiTest2() { // 抽取多个分组然后把它们拼接起来 @@ -37,7 +38,32 @@ public class ReUtilTest { String resultDelFirst = ReUtil.delFirst("(\\w)aa(\\w)", content); Assert.assertEquals("ZZbbbccc中文1234", resultDelFirst); } - + + @Test + public void delLastTest(){ + String blank = ""; + String word = "180公斤"; + String sentence = "10.商品KLS100021型号xxl适合身高180体重130斤的用户"; + //空字符串兼容 + Assert.assertEquals(blank,ReUtil.delLast("\\d+", blank)); + Assert.assertEquals(blank,ReUtil.delLast(PatternPool.NUMBERS, blank)); + + //去除数字 + Assert.assertEquals("公斤",ReUtil.delLast("\\d+", word)); + Assert.assertEquals("公斤",ReUtil.delLast(PatternPool.NUMBERS, word)); + //去除汉字 + Assert.assertEquals("180",ReUtil.delLast("[\u4E00-\u9FFF]+", word)); + Assert.assertEquals("180",ReUtil.delLast(PatternPool.CHINESES, word)); + + //多个匹配删除最后一个 判断是否不在包含最后的数字 + Assert.assertFalse(ReUtil.delLast("\\d+", sentence).contains("130")); + Assert.assertFalse(ReUtil.delLast(PatternPool.NUMBERS, sentence).contains("130")); + + //多个匹配删除最后一个 判断是否不在包含最后的数字 + Assert.assertFalse(ReUtil.delLast("[\u4E00-\u9FFF]+", sentence).contains("斤的用户")); + Assert.assertFalse(ReUtil.delLast(PatternPool.CHINESES, sentence).contains("斤的用户")); + } + @Test public void delAllTest() { // 删除所有匹配到的内容 @@ -60,14 +86,14 @@ public class ReUtilTest { Integer resultGetFirstNumber = ReUtil.getFirstNumber(content); Assert.assertEquals(Integer.valueOf(1234), resultGetFirstNumber); } - + @Test public void isMatchTest() { // 给定字符串是否匹配给定正则 boolean isMatch = ReUtil.isMatch("\\w+[\u4E00-\u9FFF]+\\d+", content); Assert.assertTrue(isMatch); } - + @Test public void replaceAllTest() { //通过正则查找到字符串,然后把匹配到的字符串加入到replacementTemplate中,$1表示分组1的字符串 @@ -75,43 +101,43 @@ public class ReUtilTest { String replaceAll = ReUtil.replaceAll(content, "(\\d+)", "->$1<-"); Assert.assertEquals("ZZZaaabbbccc中文->1234<-", replaceAll); } - + @Test public void replaceAllTest2() { //此处把1234替换为 ->1234<- String replaceAll = ReUtil.replaceAll(this.content, "(\\d+)", parameters -> "->" + parameters.group(1) + "<-"); Assert.assertEquals("ZZZaaabbbccc中文->1234<-", replaceAll); } - + @Test public void replaceTest() { String str = "AAABBCCCBBDDDBB"; String replace = StrUtil.replace(str, 0, "BB", "22", false); Assert.assertEquals("AAA22CCC22DDD22", replace); - + replace = StrUtil.replace(str, 3, "BB", "22", false); Assert.assertEquals("AAA22CCC22DDD22", replace); - + replace = StrUtil.replace(str, 4, "BB", "22", false); Assert.assertEquals("AAABBCCC22DDD22", replace); - + replace = StrUtil.replace(str, 4, "bb", "22", true); Assert.assertEquals("AAABBCCC22DDD22", replace); - + replace = StrUtil.replace(str, 4, "bb", "", true); Assert.assertEquals("AAABBCCCDDD", replace); - + replace = StrUtil.replace(str, 4, "bb", null, true); Assert.assertEquals("AAABBCCCDDD", replace); } - + @Test public void escapeTest() { //转义给定字符串,为正则相关的特殊符号转义 String escape = ReUtil.escape("我有个$符号{}"); Assert.assertEquals("我有个\\$符号\\{\\}", escape); } - + @Test public void getAllGroupsTest() { //转义给定字符串,为正则相关的特殊符号转义 @@ -121,7 +147,7 @@ public class ReUtilTest { Assert.assertEquals("192", allGroups.get(1)); Assert.assertEquals("168", allGroups.get(2)); Assert.assertEquals("1", allGroups.get(3)); - + allGroups = ReUtil.getAllGroups(pattern, "192-168-1-1", false); Assert.assertEquals("192", allGroups.get(0)); Assert.assertEquals("168", allGroups.get(1));