All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.afu.utils.string.StringUtils Maven / Gradle / Ivy

There is a newer version: 0.0.55-RELEASE
Show newest version
package io.afu.utils.string;

import com.sun.org.apache.xpath.internal.operations.Bool;
import io.afu.common.exception.BaseException;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtils {

    public static String getPriceFromStr(String str){
        Pattern p = Pattern.compile("[0-9]\\d*\\.?\\d*");
        Matcher m = p.matcher(str);
        if (m.find()){
            System.out.println("args = [" + m.group() + "]");
            return m.group();
        }
        return null;
    }


    public static String strDoubleSetTwoScale(String strDouble){
        return (new BigDecimal(strDouble)).setScale(2,BigDecimal.ROUND_HALF_UP).toString();
    }

    /**
     * 生成随机字符串
     * @param length 长度
     * @return String 生成好的字符串
     */
    public static String randStr(Integer length){
        String Chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int num = random.nextInt(62);
            buf.append(Chars.charAt(num));
        }
        return buf.toString();
    }

    /**
     * 16进制字符串 转换为bytes
     * @param str 16进制字符串
     * @return bytes
     */
    public static byte[] hexStrToBytes(String str) {
        if(str == null || str.trim().equals("")) {
            return new byte[0];
        }

        byte[] bytes = new byte[str.length() / 2];
        for(int i = 0; i < str.length() / 2; i++) {
            String subStr = str.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(subStr, 16);
        }
        return bytes;
    }

    /**
     * 通过子域名或者URL来获取根域名
     * @param urlOrDomain url或者域名
     * @return 根域名
     */
    public static String getRootDomain(String urlOrDomain){
        String tmp = urlOrDomain.replace("https://","").replace("http://","");
        String[] strs = tmp.split("/");
        String theDomain = strs[0];
        int lastDotIndex = theDomain.lastIndexOf(".");
        if (lastDotIndex == -1){
            return null;
        }
        String suffix = theDomain.substring(lastDotIndex);
        String left = theDomain.substring(0,lastDotIndex);
        int last2DotIndex = left.lastIndexOf(".");
        if (last2DotIndex == -1){
            return null;
        }
        String name = left.substring(last2DotIndex+1);
        return name+suffix;
    }


    /**
     * 出现的某个字符的次数
     * @param srcText 需要查询的文本
     * @param findText 目标字符串文本
     * @return 数量
     */
    public static int appearNumber(String srcText, String findText) {
        int count = 0;
        Pattern p = Pattern.compile(findText);
        Matcher m = p.matcher(srcText);
        while (m.find()) {
            count++;
        }
        return count;
    }

    /**
     * 判断数值是否是奇数
     * @param i 数值
     * @return 布尔值
     */
    public static boolean isOdd(int i) {
        return (i & 1) != 0;
    }


    public static Boolean isEmpty(String theStr){
        return null == theStr || "".equals(theStr.trim());
    }

    public static Boolean isNotEmpty(String theStr){
        return null != theStr && !"".equals(theStr.trim());
    }

    /**
     * 检查是否是正常是字符串
     * @param strToVerify  需要检查的字符串
     * @return boolean
     */
    public static boolean isNormalString(String strToVerify){
        String strRegex = "^[A-Za-z0-9\\-]+$";
        Pattern pattern = Pattern.compile(strRegex);
        Matcher matcher = pattern.matcher(strToVerify);
        return matcher.find();
    }

    /**
     * 判断是否是url
     * @param strToVerify 待检查的字符串
     * @return boolean
     */
    public static boolean isUrlString(String strToVerify){
        boolean isurl = false;
        String regex = "(((https|http)?://)?([a-z0-9]+[.])|(www.))"
                + "\\w+[.|\\/]([a-z0-9]{0,})?[[.]([a-z0-9]{0,})]+((/[\\S&&[^,;\u4E00-\u9FA5]]+)+)?([.][a-z0-9]{0,}+|/?)";//设置正则表达式

        Pattern pat = Pattern.compile(regex.trim());//对比
        Matcher mat = pat.matcher(strToVerify.trim());
        isurl = mat.matches();//判断是否匹配
        if (isurl) {
            isurl = true;
        }
        return isurl;
    }


    /**
     * 通过md5值加密字符串
     * @param str 带加密的字符串
     * @return 加密后的字符串
     * @throws Exception 抛出的错误
     */
    public static String md5Str(String str) throws Exception{
        try{
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(str.getBytes());
            return new BigInteger(1,messageDigest.digest()).toString(16);
        }catch (Exception e){
            throw new Exception(e);
        }
    }


    public static String randToken(){
        return randStr(32);
    }

    /**
     * 将html字符串的br转换为p
     * @param source 待转换的原始字符串
     * @return 转换后的字符串
     */
    public static String changeBrToP(String source){
        String output = "";
        source = source.replace("
","
"); source = source.replace("
","
"); String[] lists = source.split("
"); for (String line:lists){ String newLine = ""; String tline = line.trim(); if (!tline.equals("")){ newLine = "

"+tline+"

"; output = output + newLine; } } return output.replace(" ",""); } /** * 通过文章标题获取标题中的数字 * @param title 标题 * @return 返回排行 */ public static Integer getTitleNum(String title){ String rgex = "第(.*?)章"; Pattern pattern = Pattern.compile(rgex); Matcher matcher = pattern.matcher(title); if (matcher.find()){ Integer orderNum = chineseNumToInt(matcher.group(1)); return orderNum; } rgex = "(.*?)章"; pattern = Pattern.compile(rgex); matcher = pattern.matcher(title); if (matcher.find()){ Integer orderNum = chineseNumToInt(matcher.group(1)); return orderNum; } rgex = "第(.*?)掌"; pattern = Pattern.compile(rgex); matcher = pattern.matcher(title); if (matcher.find()){ Integer orderNum = chineseNumToInt(matcher.group(1)); return orderNum; } return -1; } /** * 改方法能将中文字符串数值转换为Int的数值。如报错,请提供数值字符串我去还原现场,毕竟一个小时的产物,可能思虑不周,请见谅 * @param num 带转换的数值 * @return 数值 */ public static Integer chineseNumToInt(String num){ System.out.println("num = [" + num + "]"); Integer resultNum = 0; String[] list = num.split(""); Integer tmpNum = 0; Integer mark = 0; for (int i =0; i< list.length;i++ ){ String str = list[i]; if (isQuantifier(str)){ mark = 1; } if (isCNNumber(str)){ mark = 0; } if (mark.equals(0)){ resultNum = resultNum + tmpNum; tmpNum = 0; switch (str){ case "一": tmpNum = 1; break; case "二": tmpNum = 2; break; case "三": tmpNum = 3; break; case "四": tmpNum = 4; break; case "五": tmpNum = 5; break; case "六": tmpNum = 6; break; case "七": tmpNum = 7; break; case "八": tmpNum = 8; break; case "九": tmpNum = 9; break; case "零": tmpNum = 0; break; case "壹": tmpNum = 1; break; case "贰": tmpNum = 2; break; case "叁": tmpNum = 3; break; case "肆": tmpNum = 4; break; case "伍": tmpNum = 5; break; case "陆": tmpNum = 6; break; case "柒": tmpNum = 7; break; case "捌": tmpNum = 8; break; case "玖": tmpNum = 9; break; default: tmpNum=0; break; } if (i == list.length-1){ resultNum = resultNum + tmpNum; } }else if (mark.equals(1) || mark.equals(2)){ if (i==0){ tmpNum = 1; } switch (str){ case "圆": tmpNum = tmpNum * 1; break; case "十": tmpNum = tmpNum * 10; break; case "拾": tmpNum = tmpNum * 10 ; break; case "百": tmpNum = tmpNum * 100; break; case "佰": tmpNum = tmpNum * 100; break; case "千": tmpNum = tmpNum * 1000; break; case "仟": tmpNum = tmpNum * 1000; break; case "万": tmpNum = tmpNum * 10000; break; case "萬": tmpNum = tmpNum * 10000; break; case "亿": tmpNum = tmpNum * 100000000; break; } if (i==0){ resultNum = resultNum +tmpNum; tmpNum = 0; } if (i == list.length-1){ resultNum = resultNum + tmpNum; } } } System.out.println("num = [" + resultNum + "]"); return resultNum; } public static Boolean isBlank(String str){ return str == null || str.equals(""); } /** * 判断是否是中文数字 * @param str 带判断的字符串 * @return boolean */ public static Boolean isQuantifier(String str){ String[] quantifier = {"圆","十","拾","百","佰","千","仟","万","萬"}; for (String qStr:quantifier){ if (qStr.equals(str)){ return true; } } return false; } /** * 判断是否是中文数字 * @param str 待判断的字符串 * @return boolean */ public static Boolean isCNNumber(String str){ String[] CNNumber = {"玖","捌","柒","陆","伍","肆","叁","贰","壹","零","九","八","七","六","五","四","三","二","一"}; for (String cnNum:CNNumber){ if (cnNum.equals(str)){ return true; } } return false; } /** * 获取域名网址 * @param url 待获取的网址 * @return 获取的网址 */ public static String getBaseUrl(String url){ String[] strs = url.split("://"); String protocol = strs[0]; String domain = strs[1].split("/")[0]; return protocol+"://"+domain; } /** * 将url处理为完整的URL,注意!要处理的url必须是从baseUrl中获取的,否则会出错! * @param urlToDeal 需要处理的url * @param baseUrl 基础url * @return 完整的URL */ public static String makeUrlFull(String urlToDeal,String baseUrl){ if (urlToDeal.startsWith("/")){ return getBaseUrl(baseUrl)+urlToDeal; }else if (urlToDeal.startsWith("http://")){ return urlToDeal; }else if (urlToDeal.startsWith("https://")){ return urlToDeal; }else { return baseUrl+urlToDeal; // 例如http://www.baidu.com/23333 这个是baseUrl ,www/www/www 这个是urlToDeal 那么就可以两个组合一起, } } public static String addUrlProtocol(String url,String protocol){ if (url.startsWith("http")||url.startsWith("https")){ return url.replace("\r","").replace("\n",""); }else { if (url.startsWith("//")){ return (protocol+":"+url).replace("\r","").replace("\n",""); }else { return (protocol+"://"+url).replace("\r","").replace("\n",""); } } } /** * 解析ids到列表id * @param ids 待解析的列表 * @return 列表 */ public static List parseIdsToIntIds(String ids){ List intIds = new ArrayList<>(); String[] strIds = ids.split(","); for (String id:strIds){ Long tmp = Long.valueOf(id); intIds.add(tmp); } return intIds; } /** * 将时间转为2018-01-01 11:11:11 这种格式 * @param time 待转换的时间 * @return 转换后的时间 */ public static String timeToStr(Date time){ SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return dateFm.format(time); } /** * 转换p到r * @param str 待转换的字符串 * @return 转换后的字符串 */ public static String parsePtoR(String str){ str = str.replace("

","").replace(" ","").replace("

","\n").replace(" ",""); return str; } /** * 将带P的html文本转换成文本 * @param str 文本 * @return 返回列表 */ public static String[] parsePtoList(String str){ String[] dealed = str.replace("

","").replace(" ","").split("

"); return dealed; } /** * 将阿拉伯数字转换为中文的一二三四 * @param num 数字 * @return 返回中文的数字 */ public static String translateIntNumToStr(Integer num){ String word = ""; if (num>=10000 && num <100000000){ Integer tmp = num / 10000; word = tmp.toString()+"万字"; }else if (num >100000000){ Integer tmp = num / 100000000; word = tmp.toString()+"亿字"; }else { word = num.toString()+"字"; } return word; } /** * 是否包含数值 * @param text 字符串文本 * @return true为包含,false为不包含 */ public static Boolean containsNum(String text){ String pRule = ".*\\d+.*"; Pattern p = Pattern.compile(pRule); Matcher m = p.matcher(text); return m.find(); } /** * 通过URL获取URL中包含的文件名 * @param url 需要处理的URL * @return 文件名 */ public static String getFileNameByUrl(String url) { String fileName = null; String[] strs = url.split("\\?"); String urlWithoutParam = strs[0]; System.out.println(strs[0]); int lastIndex = urlWithoutParam.lastIndexOf("/"); fileName = urlWithoutParam.substring(lastIndex+1); return fileName; } public static String[] STRING_SPLITER = {",",",","。","\n","\r"," "}; public static String[] COUPON_NOTICE = {"优惠码"}; public static List getSmaillLineWithStr(String containStr,String fullText) { List strs = new ArrayList<>(); int index = fullText.indexOf(containStr); if (index == -1){ return strs; } String nextStr = fullText.substring(index); String preStr = fullText.substring(0,index); int nextInt = -1; int preInt = -1; for (String spliter:STRING_SPLITER){ int tmpNextIndex = nextStr.indexOf(spliter); if (nextInt == -1){ nextInt = tmpNextIndex; } if (nextInt != -1 && nextInt > tmpNextIndex && tmpNextIndex != -1){ nextInt = tmpNextIndex; } int tmpPreIndex = preStr.lastIndexOf(spliter); if (preInt == -1){ preInt = tmpPreIndex; } if (preInt != -1 && preInt getLeft = getSmaillLineWithStr(containStr,leftStr); if (getLeft.size()>0){ strs.addAll(getLeft); } return strs; } public static void checkVersionType(String ver) throws BaseException { String[] strList = ver.split("\\."); for (String str:strList){ try{ Integer v = Integer.valueOf(str); }catch (Exception e){ throw new BaseException("您传入的版本的值不对,版本值仅支持如下格式\" xxx.xxx.xxx 其中xxx是数值\""); } } } public static void main(String[] args) throws BaseException { // System.out.println(getLineWithStr("你好","去你吗的你好")); String str = "hostens是成立于2003年的立陶宛公司“Interneto Vizija”的子品牌,Interneto Vizija”整体业务在欧洲发展的相当不错,至今已经为超过10万名用户提供过服务;到2005年,hostens已成为了立陶宛最大的网络托管服务提供商;主要提供经济实惠且可扩展的企业级主机产品,大致业务分为为客户提供域名注册、网络托管和VPS服务,至今拥有超过15年的托管业务经验。 官方网站:https://www.hostens.com/zh-hans/ 一些图片展示: 结合Interneto Vizija公司强大的技术背景,hostens能够在立陶宛维尔纽斯(欧洲地理中心)提供地理位置优越的数据中心,以及与所有欧洲网络交换点之间的快速可靠的光纤连接。根据TIER III国际标准建立和维护Hostens主机的独立数据中心(机房)。 位置:立陶宛维尔纽斯 根据TIER III标准建立 2个独立的2兆瓦电源供电 3 x 664 kW柴油发电机 4 x 275 kW不间断电源 6 x 146 kW“自然冷却”制冷系统 2个独立的光通信输入 140个服务器机架 每个机架都有冗余电源和互联网连接 网络测试: 立陶宛:109.235.69.33, https://lg.hostens.com/1GB.test 新加坡(leaseweb):209.58.177.107,http://209.58.182.160/LG/1GB.test 弗吉尼亚(leaseweb):198.7.57.253,http://198.7.58.222/LG/1GB.test 虚拟主机 非常适合做个人网站、博客、小企业站等,性价比高,操作方便 特征:cpanel面板,免费SS证书(Let’s Encrypt)、PHP(5.2~7.2)、MariaDB 10 (MySQL 5.6),服务器配置:2 x Gold 6132,384 GB DDR4-2666 ECC ,10 x 960 GB SSD RAID,4 Gbps独享带宽! VALUE:20G空间,2T流量/月,建站2个,20个MySQL,$2.5/月 Professional:40G空间,4T流量/月,建站4个,40个MySQL,$3.33/月 ULTIMATE:80G空间,8T流量/月,建站 8个,80个MySQL,$5/月 网址:https://www.hostens.com/zh-hans/虚拟主机/ VPS业务分三个大类 (1)KVM系列VPS KVM虚拟,纯SSD,100Mbps带宽,自带一个IPv4,支持升级 内存 CPU SSD 流量 价格 购买 2G 1核 20G 2T $39.99/年 链接 4G 1核 40G 4T $59.99/年 链接 8G 2核 80G 8T $99.99/年 链接 Container系列 OpenVZ虚拟,纯SSD,100Mbps带宽,自带一个IPv4,支持升级 内存 CPU SSD 流量 价格 购买 2G 1核 20G 2T/月 $29.99/年 链接 4G 1核 40G 4T/月 $39.99/年 链接 8G 2核 80G 8T/月 $59.99/年 链接 Storage系列 OpenVZ虚拟,HDD,100Mbps带宽,自带一个IPv4,支持升级 内存 CPU HDD 流量 价格 购买 256M 1核 256G 2T $29.99/年 链接 512M 1核 512G 4T $39.99/年 链接 1G 1核 1024G 8T $59.99/年 链接\n"; str = "bandwagonhost(搬瓦工VPS)最新消息:香港VPS出了新系列,依旧是MCX10 (Kwai Chung) 数据中心,1Gbps带宽,直连国内,4个套餐,KVM、SSD(raid10)、免费快照(可以导出、导入)。搬瓦工香港VPS主打高端用户,价格较贵,适合商用,链接国内、国外、做中转,效果都是非常好的!支付方式:信用卡、PayPal、支付宝 官方网站:https://bwh88.net 优惠码:BWH34QMFYT2R,节约6.38%。全场通用! 香港机房VPS,1Gbps大带,宽企业级VPS 适合预算高,对速度特别看重的用户,特征:KVM虚拟,1Gbps带宽,纯SSD raid 10,三网直连,每个VPS自带一个IPv4,后台有一键快照(备份VPS,还可以导入导出)功能 内存 CPU 硬盘 流量 价格 购买 2G 2核 40G 500G/月 $90/月 链接 4G 4核 80G 1.0T/月 $156/月 链接 8G 6核 160G 2.0T/月 $300/月 链接 16G 8核 320G 4.0T/月 $590/月 链接 如果你有欧美业务,考虑下 DC_6机房,CN2 GIA系列,10Gbps带宽 CN2 GIA网络,高达10Gbps企业级带宽, KVM虚拟,纯SSD(raid10),自带一个IPv4,自带快照等。本系列VPS为DC 6机房。 512M为限量版,多数时候是不卖的,如果看到补货就直接秒吧! 内存 CPU SSD 流量 带宽 价格 购买 512M 1核 10G 0.5T 1.0G $50/年 链接 1G 2核 20G 1.0T/月 2.5G $66/半年 链接 2G 3核 40G 2.0T/月 2.5G $70/季 链接 4G 4核 80G 3.0T/月 2.5G $50/月 链接 8G 6核 160G 5.0T/月 5.0G $76/月 链接 16G 8核 320G 8.0T/月 10G $140/月 链接 32G 10核 640G 10.0T/月 10G $250/月 链接 64G 12核 1280G 12.0T/月 10G $480/月 链接 关于快照:搬瓦工的VPS都提供快照功能,点击一下,自动将VPS整体一键打包备份,免费帮你保存,并且允许你将备份的这个文件导出去,存放到其他地方,以后你可以到导入进来恢复!对于系统复制复杂的用户,可以做到一次配置,长久使用;同时,也是数据备份的一个办法!\n"; str = "遨游主机上新货了:德国CN2,欧洲电信中心,德国法兰克福,全新冷门非拥堵CN2线路,去程和回程均为CN2,延迟180,比常规美国PING更低。母鸡服务器采用惠普HP,双路E5CPU,8组企业级SSD 组建raid10+BBU 架构,可以取代美国的拥堵线路,适合国内和有欧洲业务的客户使用! 傲游主机,2010年投资成立,在澳大利亚和美国均注册了公司,为ARIN,RIPE 以及APNIC会员单位,拥有自有IP段.现运营欧洲,美国,日本,韩国,新加坡和香港 云主机.,均为亚太优势线路机房。 官方网站:https://www.aoyouhost.com/ 7.5折优惠码:75GERCN2 终身8折优惠码:haixiuge,长久有效! 特征:KVM虚拟,纯SSD(raid10+BBU),50M带宽(100M入),自带一个IPv4,centos、Debian、Ubuntu、windows server 2003+2008。 下面是原价,感兴趣的记得使用优惠码! 内存 CPU SSD 流量 价格 购买 2G 2核 40G 800G 70元/月 链接 4G 2核 50G 1.0T 90元/月 链接 4G 2核 60G 1.5T 120元/月 链接 8G 4核 80G 2.0T 288元/月 链接 送上最低配的德国CN2 VPS的一点儿测评数据: IP非原生: CPU看起来负载相当低: 内存读写GOOD: SSD写入测试4K快,62.8MB/S,还行略微偏上,毕竟不是NVMe: 官方说的是上行带宽50Mbps,下行100Mbps: 看三网回程,都走CN2: 国内去程,上海电信,走CN2: 去程,联通也不错,至少不饶美国了: 去程,移动,走电信的出口: 电信最低可以到150MS,联通和移动最快差不多170MS,看平均响应值应该也是非常好了,这特么不是美国,这是欧洲的德国...\n"; str = "优惠码:VPSMM_S123.45元"; List result = getSmaillLineWithStr("优惠码",str); for (String theStr:result){ System.out.println(theStr); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy