java小工具util系列2:字符串工具

简介: java小工具util系列2:字符串工具

image.png

@[toc]

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 请求字符串
   * @author liudz
   * @date 2019/12/17
   * @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

9.返回字符串非零的最后一个层级

比如字符串1.2.3.0.0.0,那么最后一个层级是3

/**
     * 返回vpn非零的最后一个层级
     * 例如 1.2.3.0.0.0 -> 3
     * 0.0.0.0.0.0 -> -1
     * @param vpnNodeString
     * @return
     */
public static int getLastLevel(String vpnNodeString) {
        int index = vpnNodeString.indexOf("0") / 2;
        return "0.0.0.0.0.0".equals(vpnNodeString) ? -1 : index;
}

10.根据传入的组织节点,取出非0节点,为了后续sql中查询其子项

例如 1.1.1.0.0.0 -> 1.1.1 计算结果为1.1.1

/**
* 根据传入的组织节点,取出非0节点,为了后续sql中查询其子项
 * 例如 1.1.1.0.0.0 -> 1.1.1  vpn like '1.1.1%'
 * 根节点0.0.0.0.0.0 -> %
 * @param vpnNodeString
 * @return
 */
public static String getVpnMax(String vpnNodeString) {
    // 截取出vpn节点的最大节点用于后续查询所有子节点,根节点取所有
    int index = vpnNodeString.indexOf(".0");
    String vpnMax = index == -1 ? vpnNodeString : vpnNodeString.substring(0, index);
    return "0".equals(vpnMax) ? "%" : vpnMax;
}

11.根据开始日期字符串、结束日期字符串,按15分钟力度返回结束日期字符串集合,举例:开始时间20240318120000、结束时间20240319120000,返回集合[20240318121500, 20240318123000, 20240318124500...]

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public static void main(String[] args) {
   
        String start = "20240318120000";
        String end = "20240319120000";
        System.out.println(listSumsDateStr(start,end));
    }

    /**
     * 根据开始日期字符串、结束日期字符串,按15分钟力度返回结束日期字符串集合,举例:开始时间20240318120000、结束时间20240319120000,返回集合[20240318121500, 20240318123000, 20240318124500...]
     * @param start 开始日期字符串
     * @param end 结束日期字符串
     * @return 按15分钟力度返回结束日期字符串集合
     */
    public static  List<String> listSumsDateStr(String start, String end) {
   
        long dateStamp = 0l;
        try {
   
            dateStamp = parseTime(start);
        } catch (ParseException e) {
   
            throw new RuntimeException(e);
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(dateStamp);
        calendar.set(Calendar.SECOND,00);
        if(calendar.get(Calendar.MINUTE) <=15){
   
            calendar.set(Calendar.MINUTE,15);
        }else if(calendar.get(Calendar.MINUTE) <=30) {
   
            calendar.set(Calendar.MINUTE,30);
        }else if(calendar.get(Calendar.MINUTE) <=45) {
   
            calendar.set(Calendar.MINUTE,45);
        }else if(calendar.get(Calendar.MINUTE) <59) {
   
            calendar.set(Calendar.MINUTE,0);
            calendar.add(Calendar.HOUR,1);
        }

        long reportStartTime = calendar.getTimeInMillis();
        System.out.println(formatTime(reportStartTime + ""));
        long enddateStamp = 0l;
        try {
   
            enddateStamp = parseTime(end);
        } catch (ParseException e) {
   
            throw new RuntimeException(e);
        }
        Calendar endcalendar = Calendar.getInstance();
        endcalendar.setTimeInMillis(enddateStamp);
        endcalendar.set(Calendar.SECOND,00);
        if(endcalendar.get(Calendar.MINUTE) <=15){
   

            endcalendar.set(Calendar.MINUTE,0);
            endcalendar.add(Calendar.HOUR,-1);
        }else if(endcalendar.get(Calendar.MINUTE) <=30) {
   
            endcalendar.set(Calendar.MINUTE,15);

        }else if(endcalendar.get(Calendar.MINUTE) <=45) {
   

            endcalendar.set(Calendar.MINUTE,30);
        }else if(endcalendar.get(Calendar.MINUTE) <59) {
   
            endcalendar.set(Calendar.MINUTE,45);
        }
        System.out.println(formatTime(endcalendar.getTimeInMillis() + ""));
        List<String> list = new ArrayList<String>();
        while (reportStartTime < enddateStamp) {
   
            reportStartTime = calendar.getTimeInMillis();
            calendar.add(Calendar.MINUTE, 15);
            if(reportStartTime<=enddateStamp) {
   
                list.add(formatTime(reportStartTime + ""));
            }

        }
        return list;
    }
    public static String formatTime(String time) {
   

        SimpleDateFormat sf1 = new SimpleDateFormat("yyyyMMddHHmmss");

        long tmpTime = Long.parseLong(time);

        time = sf1.format(new Date(tmpTime));

        return time;
    }


    public static long parseTime(String time) throws ParseException {
   

        SimpleDateFormat sf1 = new SimpleDateFormat("yyyyMMddHHmmss");

        Date tmpTime = sf1.parse(time);

        return tmpTime.getTime();
    }

12. 提取字符串中提取出时区的偏移量

举例说明:比如我给定的时间字符串为“GMT+08:00”,而我最后想提取的结果是“+08:00”

public static void main(String[] args) {
   
    String timeZone2 = "GMT+08:00";
    String patternStr1 = "XXX";
    DateFormat f = new SimpleDateFormat(patternStr1);
    f.setTimeZone(TimeZone.getTimeZone(timeZone2));
    String zone = f.format(new Date());
    System.out.println(zone);
}

本人其他文章链接

1.java小工具util系列1:日期毫秒数转日期字符串
https://blog.csdn.net/a924382407/article/details/121955349

2.java小工具util系列2:获取字符modelStr在字符串str中第count次出现时的下标
https://blog.csdn.net/a924382407/article/details/121955455

3.java小工具util系列3:正则表达式匹配:匹配不包含@特殊字符的字符串
https://blog.csdn.net/a924382407/article/details/121955737

4.java小工具util系列4:String[] 转 List< Integer >
https://blog.csdn.net/a924382407/article/details/121956201

5.java小工具util系列5:基础工具代码(Msg、PageResult、Response、常量、枚举)
https://blog.csdn.net/a924382407/article/details/120952865

6.java小工具util系列6:java执行string返回boolean结果
https://blog.csdn.net/a924382407/article/details/117124536

7.java小工具util系列7:集合中实体对象转换 list中Enrey转Dto
https://blog.csdn.net/a924382407/article/details/121957545

8.java小工具util系列8:JSONObject获取key
https://blog.csdn.net/a924382407/article/details/121957607

9.java小工具util系列9:检测一个字符串是否是时间格式
https://blog.csdn.net/a924382407/article/details/123948881

10.java小工具util系列10:时间毫秒数、时间格式字符串、日期之间相互转化
https://blog.csdn.net/a924382407/article/details/124581851

image.png

重要信息

image.png
image.png
image.png
image.png

目录
相关文章
|
2天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
37 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
55 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
58 26
|
Java 网络安全 数据安全/隐私保护
[Java工具] 邮件发送工具
注册邮箱 去163邮箱(或其他邮箱)注册一个邮箱,并开启SMTP授权码。 程序 需要注意的是,由于阿里云服务器不让使用默认的25端口,所以会出现Windows下测试发送邮件成功,Linux服务器下发送邮件却出错的问题(broke pipe、timeout、can not connect等)。
1767 0
|
7天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
9天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
9天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
9天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
32 3
|
9天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
86 2

热门文章

最新文章