From f349d770e266e292022748d5901b9bf0e1005965 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 30 Jul 2020 08:59:29 +0800 Subject: [PATCH] add PhoneUtil --- CHANGELOG.md | 3 +- .../java/cn/hutool/core/lang/PatternPool.java | 2 +- .../java/cn/hutool/core/util/PhoneUtil.java | 200 +++++++++--------- .../java/cn/hutool/core/util/StrUtil.java | 28 +-- .../cn/hutool/core/util/PhoneUtilTest.java | 102 +++++---- 5 files changed, 149 insertions(+), 186 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abfd25449..979c540f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,11 @@ ------------------------------------------------------------------------------------------------------------- -## 5.3.11 (2020-07-25) +## 5.3.11 (2020-07-30) ### 新特性 * 【captcha】 AbstractCaptcha增加getImageBase64Data方法(pr#985@Github) +* 【core 】 增加PhoneUtil(pr#990@Github) ### Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java index c56a2e3df..4159f0110 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java @@ -55,7 +55,7 @@ public class PatternPool { /** * 移动电话 */ - public final static Pattern MOBILE = Pattern.compile("(?:0|86|\\+86)?1[3456789]\\d{9}"); + public final static Pattern MOBILE = Pattern.compile("(?:0|86|\\+86)?1[3-9]\\d{9}"); /** * 18位身份证号码 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java index d88b2071d..9b05578a4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/PhoneUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.util; +import cn.hutool.core.lang.PatternPool; import cn.hutool.core.lang.Validator; import java.util.regex.Pattern; @@ -9,120 +10,113 @@ import java.util.regex.Pattern; * 手机号工具类 * * @author dahuoyzs + * @since 5.3.11 */ public class PhoneUtil { - /** - * 手机号码 - */ - private static Pattern MOBILE = Pattern.compile("(?:0|86|\\+86)?1[3456789]\\d{9}"); - /** - * 座机号码 - * */ - private static Pattern TEL = Pattern.compile("0\\d{2,3}-[1-9]\\d{6,7}"); - /** - * 座机号码+手机号码 - * */ - private static Pattern PHONE = Pattern.compile("^([0-9]{3}-?[0-9]{8})|dao([0-9]{4}-?[0-9]{7})$"); + /** + * 座机号码 + */ + private static Pattern TEL = Pattern.compile("0\\d{2,3}-[1-9]\\d{6,7}"); - /** - * 验证是否为手机号码(中国) - * - * @param value 值 - * @return 是否为手机号码(中国) - * @since 5.3.11 - */ - public static boolean isMobile(CharSequence value) { - return Validator.isMatchRegex(MOBILE, value); - } + /** + * 验证是否为手机号码(中国) + * + * @param value 值 + * @return 是否为手机号码(中国) + * @since 5.3.11 + */ + public static boolean isMobile(CharSequence value) { + return Validator.isMatchRegex(PatternPool.MOBILE, value); + } - /** - * 验证是否为座机号码(中国) - * - * @param value 值 - * @return 是否为座机号码(中国) - * @since 5.3.11 - */ - public static boolean isTel(CharSequence value) { - return Validator.isMatchRegex(TEL, value); - } + /** + * 验证是否为座机号码(中国) + * + * @param value 值 + * @return 是否为座机号码(中国) + * @since 5.3.11 + */ + public static boolean isTel(CharSequence value) { + return Validator.isMatchRegex(TEL, value); + } - /** - * 验证是否为座机号码+手机号码(中国) - * - * @param value 值 - * @return 是否为座机号码+手机号码(中国) - * @since 5.3.11 - */ - public static boolean isPhone(CharSequence value) { - return Validator.isMatchRegex(PHONE, value); - } + /** + * 验证是否为座机号码+手机号码(中国) + * + * @param value 值 + * @return 是否为座机号码+手机号码(中国) + * @since 5.3.11 + */ + public static boolean isPhone(CharSequence value) { + return isMobile(value) || isTel(value); + } - /** - * 隐藏手机号前7位 替换字符为"*" - * 栗子 - * - * @param phone 手机号码 - * @return 替换后的字符串 - * @since 5.3.11 - */ - public static CharSequence hideBefore(CharSequence phone){ - return StrUtil.hide(phone,0,7); - } + /** + * 隐藏手机号前7位 替换字符为"*" + * 栗子 + * + * @param phone 手机号码 + * @return 替换后的字符串 + * @since 5.3.11 + */ + public static CharSequence hideBefore(CharSequence phone) { + return StrUtil.hide(phone, 0, 7); + } - /** - * 隐藏手机号中间4位 替换字符为"*" - * - * @param phone 手机号码 - * @return 替换后的字符串 - * @since 5.3.11 - */ - public static CharSequence hideBetween(CharSequence phone){ - return StrUtil.hide(phone,3,7); - } + /** + * 隐藏手机号中间4位 替换字符为"*" + * + * @param phone 手机号码 + * @return 替换后的字符串 + * @since 5.3.11 + */ + public static CharSequence hideBetween(CharSequence phone) { + return StrUtil.hide(phone, 3, 7); + } - /** - * 隐藏手机号最后4位 替换字符为"*" - * - * @param phone 手机号码 - * @return 替换后的字符串 - * @since 5.3.11 - */ - public static CharSequence hideAfter(CharSequence phone){ - return StrUtil.hide(phone,7,11); - } + /** + * 隐藏手机号最后4位 替换字符为"*" + * + * @param phone 手机号码 + * @return 替换后的字符串 + * @since 5.3.11 + */ + public static CharSequence hideAfter(CharSequence phone) { + return StrUtil.hide(phone, 7, 11); + } - /** - * 获取手机号前3位 - * - * @param phone 手机号码 - * @return 手机号前3位 - * @since 5.3.11 - */ - public static CharSequence subBefore(CharSequence phone){ - return StrUtil.sub(phone,0,3); - } + /** + * 获取手机号前3位 + * + * @param phone 手机号码 + * @return 手机号前3位 + * @since 5.3.11 + */ + public static CharSequence subBefore(CharSequence phone) { + return StrUtil.sub(phone, 0, 3); + } - /** - * 获取手机号中间4位 - * - * @param phone 手机号码 - * @return 手机号中间4位 - * @since 5.3.11 - */ - public static CharSequence subBetween(CharSequence phone){ - return StrUtil.sub(phone,3,7); - } + /** + * 获取手机号中间4位 + * + * @param phone 手机号码 + * @return 手机号中间4位 + * @since 5.3.11 + */ + public static CharSequence subBetween(CharSequence phone) { + return StrUtil.sub(phone, 3, 7); + } - /** - * 获取手机号后4位 - * - * @param phone 手机号码 - * @return 手机号后4位 - * @since 5.3.11 - */ - public static CharSequence subAfter(CharSequence phone){ - return StrUtil.sub(phone,7,11); - } + /** + * 获取手机号后4位 + * + * @param phone 手机号码 + * @return 手机号后4位 + * @since 5.3.11 + */ + public static CharSequence subAfter(CharSequence phone) { + return StrUtil.sub(phone, 7, 11); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java index d1d56ac1b..d1cb98617 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -969,7 +969,7 @@ public class StrUtil { * 移除字符串中所有给定字符串,当某个字符串出现多次,则全部移除
* 例:removeAny("aa-bb-cc-dd", "a", "b") =》 --cc-dd * - * @param str 字符串 + * @param str 字符串 * @param strsToRemove 被移除的字符串 * @return 移除后的字符串 * @since 5.3.8 @@ -4043,32 +4043,6 @@ public class StrUtil { return replace(str, startInclude, endExclude, '*'); } - /** - * 制定字符覆盖原字符串。 - * 注意参数: - * StrUtil.hide()是 开始位置,到结束位置。 - * StrUtil.cover()是 开始位置,指定长度。 - * - * @param str 原字符串 - * @param start 开始位置 - * @param len 覆盖的长度 - * @param character 覆盖的符号 - * @return 返回值类型 符号覆盖字符后的字符串 - * @since 5.3.11 - * @author dahuoyzs - */ - public CharSequence cover(String str,int start,int len,Character character){ - if (start<0||len>str.length()){ - throw new IndexOutOfBoundsException(); - } - int end = start + len; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < str.length(); i++) { - sb.append((start <= i && i < end) ? character : str.charAt(i)); - } - return sb; - } - /** * 替换字符字符数组中所有的字符为replacedStr
* 提供的chars为所有需要被替换的字符,例如:"\r\n",则"\r"和"\n"都会被替换,哪怕他们单独存在 diff --git a/hutool-core/src/test/java/cn/hutool/core/util/PhoneUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/PhoneUtilTest.java index c4451a5e1..d00d6e733 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/PhoneUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/PhoneUtilTest.java @@ -9,66 +9,60 @@ import java.util.ArrayList; * {@link PhoneUtil} 单元测试类 * * @author dahuoyzs - * */ public class PhoneUtilTest { - @Test - public void testCheck(){ - String mobile = "13612345678"; - String tel = "010-88993108"; - String errMobile = "136123456781"; - String errTel = "010-889931081"; + @Test + public void testCheck() { + String mobile = "13612345678"; + String tel = "010-88993108"; + String errMobile = "136123456781"; + String errTel = "010-889931081"; - Assert.assertTrue(PhoneUtil.isMobile(mobile)); - Assert.assertTrue(PhoneUtil.isTel(tel)); - Assert.assertTrue(PhoneUtil.isPhone(mobile)); - Assert.assertTrue(PhoneUtil.isPhone(tel)); + Assert.assertTrue(PhoneUtil.isMobile(mobile)); + Assert.assertTrue(PhoneUtil.isTel(tel)); + Assert.assertTrue(PhoneUtil.isPhone(mobile)); + Assert.assertTrue(PhoneUtil.isPhone(tel)); - Assert.assertFalse(PhoneUtil.isMobile(errMobile)); - Assert.assertFalse(PhoneUtil.isTel(errTel)); - Assert.assertFalse(PhoneUtil.isPhone(errMobile)); - Assert.assertFalse(PhoneUtil.isPhone(errTel)); - } + Assert.assertFalse(PhoneUtil.isMobile(errMobile)); + Assert.assertFalse(PhoneUtil.isTel(errTel)); + Assert.assertFalse(PhoneUtil.isPhone(errMobile)); + Assert.assertFalse(PhoneUtil.isPhone(errTel)); + } - @Test - public void testTel(){ - ArrayList tels = new ArrayList<>(); - tels.add("010-12345678"); - tels.add("020-9999999"); - tels.add("0755-7654321"); - ArrayList errTels = new ArrayList<>(); - errTels.add("010 12345678"); - errTels.add("A20-9999999"); - errTels.add("0755-7654.321"); - errTels.add("13619887123"); - for (String s : tels) { - Assert.assertTrue(PhoneUtil.isTel(s)); - } - for (String s : errTels) { - Assert.assertFalse(PhoneUtil.isTel(s)); - } - } + @Test + public void testTel() { + ArrayList tels = new ArrayList<>(); + tels.add("010-12345678"); + tels.add("020-9999999"); + tels.add("0755-7654321"); + ArrayList errTels = new ArrayList<>(); + errTels.add("010 12345678"); + errTels.add("A20-9999999"); + errTels.add("0755-7654.321"); + errTels.add("13619887123"); + for (String s : tels) { + Assert.assertTrue(PhoneUtil.isTel(s)); + } + for (String s : errTels) { + Assert.assertFalse(PhoneUtil.isTel(s)); + } + } - @Test - public void testHide(){ - String mobile = "13612345678"; - String hideBefore = "*******5678"; - String hideBetween = "136****5678"; - String hideAfter = "1361234****"; - Assert.assertEquals(PhoneUtil.hideBefore(mobile),hideBefore); - Assert.assertEquals(PhoneUtil.hideBetween(mobile),hideBetween); - Assert.assertEquals(PhoneUtil.hideAfter(mobile),hideAfter); - } + @Test + public void testHide() { + String mobile = "13612345678"; - @Test - public void testSubString(){ - String mobile = "13612345678"; - String subBefore = "136"; - String subBetween = "1234"; - String subAfter = "5678"; - Assert.assertEquals(PhoneUtil.subBefore(mobile),subBefore); - Assert.assertEquals(PhoneUtil.subBetween(mobile),subBetween); - Assert.assertEquals(PhoneUtil.subAfter(mobile),subAfter); - } + Assert.assertEquals("*******5678", PhoneUtil.hideBefore(mobile)); + Assert.assertEquals("136****5678", PhoneUtil.hideBetween(mobile)); + Assert.assertEquals("1361234****", PhoneUtil.hideAfter(mobile)); + } + + @Test + public void testSubString() { + String mobile = "13612345678"; + Assert.assertEquals("136", PhoneUtil.subBefore(mobile)); + Assert.assertEquals("1234", PhoneUtil.subBetween(mobile)); + Assert.assertEquals("5678", PhoneUtil.subAfter(mobile)); + } }