io.afu.utils.string.StringUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of utils Show documentation
Show all versions of utils Show documentation
RffanLAB Utils For Many Way use
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);
}
}
}