处理字符串中的特殊字符

找了很久都没有找到原因,参数明明没有问题。细问是怎么操作的,说是从Excel中复制过来的,于是便怀疑在复制的时候复制了多余的东西。于是试了手写是正常,mac电脑复制过来是正常,windows有些版本的Excel复制过来就有问题。本地一调试发现,果不其然,正常手写的手机号是11位,但是复制过来的确是多了一个东西,长度变为了12位,多了个'\u202D',问题找到了。

搜了一下,网上也有好多同学遇到过这个问题,于是写了个工具类,去掉其中的多余字符,问题就解决了:

 
  1.  

  2.  
package com.lianj.crm.modules.sys.utils;


import com.lianj.crm.common.utils.StringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;


import java.util.regex.Pattern;


/**

* 电话工具类

*

* @author xiaowei

* @date 2019年8月21日

*/

public class PhoneUtils {


private static Logger logger = LoggerFactory.getLogger(PhoneUtils.class);


/**

* 电话校验,先处理特殊字符后校验

* @param str

* @return

*/

public static boolean checkPhone(String str) {

if (StringUtils.isNotBlank(str)) {

dealPhoneNumber(str);// 先进行特殊字符处理

String expression = "^[1][3,4,5,6,7,8,9][0-9]{9}$";

Pattern pattern = Pattern.compile(expression);

return pattern.matcher(str).matches();

}

return false;

}


/**

* 处理电话特殊字符问题

*

* @param phone

* @return

*/

public static String dealPhoneNumber(String phone) {

if (StringUtils.isNotBlank(phone)) {

phone = removeNonAscii(phone);

phone = removeSomeControlChar(phone);

phone = removeFullControlChar(phone).trim();

return digitFileter(phone);

}

return null;

}


/**

* 数字过滤

*

* @param str

* @return

*/

public static String digitFileter(String str) {

if (StringUtils.isNotBlank(str)) {

char[] num = str.trim().toCharArray();

char[] arr = new char[num.length];

int j = 0;

for (int i = 0; i < num.length; i++) {

if (Character.isDigit(num[i])) {

arr[j] = num[i];

j++;

}

}

return String.valueOf(arr).trim();

}

return null;

}


/**

* 去除非ascii码字符

*

* @param str

* @return

*/

public static String removeNonAscii(String str) {

return str.replaceAll("[^\\x00-\\x7F]", "");

}


/**

* 去除不可打印字符

*

* @param str

* @return

*/

public static String removeNonPrintable(String str) {

return str.replaceAll("[\\p{C}]", "");

}


/**

* 去除一些控制字符 Control Char

*

* @param str

* @return

*/

public static String removeSomeControlChar(String str) {

return str.replaceAll("[\\p{Cntrl}\\p{Cc}\\p{Cf}\\p{Co}\\p{Cn}]", ""); // Some Control Char

}


/**

* 去除一些换行制表符

*

* @param str

* @return

*/

public static String removeFullControlChar(String str) {

return removeNonPrintable(str).replaceAll("[\\r\\n\\t]", "");

}


public static void main(String[] args) {

String phone = "198345688882";

System.out.println(checkPhone(phone));

}


}

总结:

'\u202D'应该是属于不可打印字符,因此不能正常显示出来,但是确实占了字符串位数,所以导致错误。mark一下,希望能帮到遇到同样错误的同学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值