Java工具类-字符串工具(可复制)

1.获取字符modelStr在字符串str中第count次出现时的下标

问题:输出字符串 "0,1,61,"的第一个逗号、第二个逗号、第三个逗号、的索引

@Test
public void getCommaIndex() {
   String str = "0,1,61,";
   String modelStr = ",";	//代表要搜索的特定字符串
   int count = 3;			//代表要搜索的特定字符串出现第几次的索引位置
   //对子字符串进行匹配
   Matcher slashMatcher = Pattern.compile(modelStr).matcher(str);
   int index = 0;
   //matcher.find();尝试查找与该模式匹配的输入序列的下一个子序列
   while(slashMatcher.find()) {
       index++;
       //当modelStr字符第count次出现的位置
       if(index == count){
           break;
       }
   }
   //matcher.start();返回以前匹配的初始索引。
   System.out.println(slashMatcher.start());
}

2.java执行string返回boolean结果

该方法针对逻辑与“&&” 和逻辑或“||” 也有效,对单个 “&” 或者“|” 执行结果无效,不过不影响真实结果。

  1. 引入依赖
  2. 封装工具类方法
<!--js脚本解析字符串返回boolean值-->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-jexl3</artifactId>
	<version>3.1</version>
</dependency>
执行字符串返回boolean结果:↓
	/**
     *  执行字符串返回boolean结果
     * @param str 要执行的字符串
     * @return 执行结果
     * @throws ScriptException 抛异常
     * 注意:缺陷(单独&和|也会识别,不过是错误答案,没参考性)
     **/
    public static Boolean executeStringReturnBoolean(String str) {
        ScriptEngineManager manager = new ScriptEngineManager();
        // 得到javascript脚本引擎
        ScriptEngine se = manager.getEngineByName("js");
        Boolean result = false;
        try {
            // 开始运行脚本 -》 我们可以使用ScriptEngine的eval方法来执行脚本
            result = Boolean.parseBoolean(se.eval(str).toString());
        } catch (ScriptException e) {
            log.error(e.getMessage());
        }
        return result;
    }

3.String[] 转 List<Integer>

String ids = new String("111,22,33,44"); 
String[] items = ids.split(",");
List<Integer> appIdList = Stream.of(items).map(Integer::parseInt).collect(Collectors.toList());

4.检测一个字符串是否是时间格式

/**
*  检测一个字符串是否是时间格式
   * @param str 请求字符串
   * @return 执行结果
   **/
public static boolean isValidDate(String str) {
    boolean convertSuccess = true;
    // 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
    SimpleDateFormat format = new SimpleDateFormat("HH:mm");
    try {
        format.setLenient(false);
        format.parse(str);
    } catch (Exception e) {
        convertSuccess = false;
    }
    return convertSuccess;
}

5.判断字符串是否是数值型,包括负数、0、正整数、浮点数等

测试方法1:使用org.apache.commons.lang3.StringUtils 

@Test
void judgeStringType()  {
    String s0 = "123";
    String s1 = "adb123";
    String s2 = "-1";
    String s3 = "0";
    String s4 = "3.1415926";
    System.out.println("判断s0是否为数值类型:" + StringUtils.isNumeric(s0)); //true
    System.out.println("判断s1是否为数值类型:" + StringUtils.isNumeric(s1)); //false
    System.out.println("判断s2是否为数值类型:" + StringUtils.isNumeric(s2)); //false
    System.out.println("判断s3是否为数值类型:" + StringUtils.isNumeric(s3)); //true
    System.out.println("判断s4是否为数值类型:" + StringUtils.isNumeric(s4)); //false
}

测试结果表明:使用org.apache.commons.lang3.StringUtils,判断字符串是否是数值类型,数值只能判断0~正整数,有一个缺陷,负数和浮点数未正确判断,比如-1判断为false

测试方法2:采用正则表达式匹配,优点:除字符串外都能匹配

@Test
void judgeStringType2()  {
    Pattern pattern = Pattern.compile("-?\\d+(\\.\\d+)?");
    String s0 = "123";
    String s1 = "adb123";
    String s2 = "-1";
    String s3 = "0";
    String s4 = "3.1415926";
    System.out.println("判断s0是否为数值类型:" + pattern.matcher(s0).matches()); //true
    System.out.println("判断s1是否为数值类型:" + pattern.matcher(s1).matches()); //false
    System.out.println("判断s2是否为数值类型:" + pattern.matcher(s2).matches()); //true
    System.out.println("判断s3是否为数值类型:" + pattern.matcher(s3).matches()); //true
    System.out.println("判断s4是否为数值类型:" + pattern.matcher(s4).matches()); //true
}

测试结果表明:采用正则表达式匹配,优点:除字符串外都能匹配,推荐使用第二种方法。

6.java正则表达式截取两字符串之间的内容 

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringExtractor {
    public static void main(String[] args) {
        String input = "这是开始字符串ABC这是要截取的内容DEF这是结束字符串";
        String startString = "ABC";
        String endString = "DEF";

        String patternString = Pattern.quote(startString) + "(.*?)" + Pattern.quote(endString);
        Pattern pattern = Pattern.compile(patternString);
        Matcher matcher = pattern.matcher(input);

        if (matcher.find()) {
            String extractedString = matcher.group(1).trim();
            System.out.println("截取的内容: " + extractedString);
        } else {
            System.out.println("未找到匹配的内容");
        }
    }
}

结果打印:这是要截取的内容

在上述代码中,我们定义了一个输入字符串 input,以及要截取的开始字符串 startString 和结束字符串 endString。

我们使用 Pattern.quote() 方法对开始字符串和结束字符串进行转义,以确保其作为字面量被正则表达式解释。

然后,我们构建了正则表达式模式 patternString,将开始字符串和结束字符串嵌入其中,并使用 .*? 来匹配两个字符串之间的任意内容(非贪婪模式)。

接下来,我们通过 Pattern.compile() 创建了一个正则表达式模式对象 pattern,并使用 pattern.matcher() 方法将其应用于输入字符串。

最后,我们使用 matcher.find() 方法查找匹配的内容。如果找到了匹配项,则使用 matcher.group(1) 获取截取的内容,并输出结果。使用trim()方法清除字符串左右两边的空格,如果未找到匹配项,则输出未找到匹配的提示。

你可以根据需要修改输入字符串以及开始和结束字符串来进行测试。

7.正则表达式匹配:匹配不包含@特殊字符的字符串

String regular = "^((?!@).)*$";
String str1 = "jxs2611@sop.com";
// 正则表达式
Pattern pattern = Pattern.compile(regular);
System.out.println("是否匹配str1:" + pattern.matcher(str1).find());

8.字符串占位符使用

    @Test
    void parseString12() {
        String str = "out of BusyTimeIndicatorAlarmThreshold! upperLimitOfTheBusyTimeThreshold=%s,lowerLimitOfTheBusyTimeThreshold=%s,reportValue=%s";
        str = String.format(str, 1, 2, 3);
        System.out.println(str);
    }

输出结果:out of BusyTimeIndicatorAlarmThreshold! upperLimitOfTheBusyTimeThreshold=1,lowerLimitOfTheBusyTimeThreshold=2,reportValue=3

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值