基于正则表达式的字符串字节长度获取

场景描述:
比如数据库表里面有一个地址描述字段,类型是varchar2(128)(128:表示可以储存128字节的内容),也就是说可以如果全是中文和中文字符的话可以储存48个字符,如果是英文或者数字就可以储存128个字符,所以需要进行校验,判断需要入库的字符串的字节数;

方法1:使用正则表达式把中文和中文字符替换成英文或者数字,然后计算长度;
方法2:定义一个变量,遍历整个字符串,如果是是中文或者中文字符,加2,否则加1,最后得到总长度;

方法3:JS的方式获取;

一、Java代码实现:

package com.zhh1;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 *
 * @author zhaoheng
 * 2018-07-20
 */
public class Test {
	public static void main(String[] args) {
		
		String name = "1E一,.";
		System.out.println(getStrByteLength(name));
	    System.out.println(getStrByteLength1(name));
	}
	
	/**
	 * 匹配
	 * 如果str符合regex的规则,则返回true否者返回false;
	 * @param str :待验证的字符
	 * @param regex :正则表达式规则
	 * @return
	 */
	public static boolean checkMatch(String str, String regex)
	{
		boolean result =true;
		try
		{
			Pattern pattern = Pattern.compile(regex);
			Matcher matcher = pattern.matcher(str);
			result = matcher.matches();
		} catch (Exception e)
		{
			result = false;
		}
		return result;
	}
	
	/**
	 * 检测字符串的字节数
	 * @param str 待检测的字符串
	 * @return 字符串的字节数
	 */
	public static long getStrByteLength(String str) {
		long length=0;
		for (int k = 0; k <str.length(); k++) {
			//判断是否包含中文或者中文字符
			if (Test.checkMatch(String.valueOf(str.charAt(k)), "[\u0391-\uFFE5]")) {
				length+=2;
			}else {
				length+=1; 
			}
		}
		return length;
	}

	/**
	 * 检测字符串的字节数
	 * @param str 待检测的字符串
	 * @return 字符串的字节数
	 */
	public static long getStrByteLength1(String str) {
        // 如果是中文,替换成aa,因为aa刚好是两个字节
		long length = str.replaceAll("[\u0391-\uFFE5]", "aa").length();
		return length;
	}
}

二、Js的方式实现

var str = "1A中,, .。";
var length = str.replace(/[\u0391-\uFFE5]/g,"aa").length;

以上是几种方式的实现,需要的时候直接使用就行了,再也不用担心入库长度校验了

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值