首页 > 编程语言 >Java按自然语言字符截取字符串

Java按自然语言字符截取字符串

时间:2023-01-31 11:22:06浏览次数:35  
标签:end charIndex int 截取 start str test Java 自然语言

由于unicode字符在java中可能超过2个char,String类自带的substring不能很好的满足要求,可能产生? ,所以按照commons的StringUtils开发了这个方法

  /**
     * 仿照{@link StringUtils#substring(String, int, int)}开发的自然语言截取方法,考虑到了多语言字符截取问题,
     * 配合nvarchar类型字段的截取函数使用
     * @param str 要截取的字符串
     * @param start 字符开始位置,包含
     * @param end 字符结束位置,不包含
     * @return
     */
    public static String naturalSubstring(String str, int start, int end) {
        if (str == null) {
            return null;
        }

        // handle negatives
        int naturalLength = str.codePointCount(0, str.length());
        if (end < 0) {
            end = naturalLength + end; // remember end is negative
        }
        if (start < 0) {
            start = naturalLength + start; // remember start is negative
        }

        // check length next
        if (end > naturalLength) {
            end = naturalLength;
        }

        // if start is greater than end, return ""
        if (start > end) {
            return "";
        }

        if (start < 0) {
            start = 0;
        }
        if (end < 0) {
            end = 0;
        }

        StringBuilder result = new StringBuilder();
        int codePointCounter = 0;
        int charIndex = 0;
        if (start > 0 ) {
            // 过滤起始
            for (; charIndex < str.length() && codePointCounter < start; charIndex++,codePointCounter++) {
                if (Character.isHighSurrogate(str.charAt(charIndex))) {
                    charIndex++;
                }
            }
        }
        if (end < naturalLength) {
            for (; charIndex < str.length() && codePointCounter < end; charIndex++, codePointCounter++) {
                result.append(str.charAt(charIndex));
                if (Character.isHighSurrogate(str.charAt(charIndex))) {
                    result.append(str.charAt(++charIndex));
                }
            }
        } else {
            return str.substring(charIndex, str.length());
        }
        return result.toString();
    }

测试

        // "\uD83D\uDF01" == 

标签:end,charIndex,int,截取,start,str,test,Java,自然语言
From: https://www.cnblogs.com/marshwinter/p/17078398.html

相关文章

  • 关于IDEA运行时报内存溢出FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - Jav
    IDEA运行时,经常会碰到内存溢出问题:FATALERROR:CALL_AND_RETRY_LASTAllocationfailed-JavaScriptheapoutofmemory,非常讨厌,浪费时间,现记录解决方案如下:1、全......
  • JAVA常用类
    JAVA常用类String常用方法length()返回字符串的长度charAt()根据下标获取字符contains()判断当前字符串中是否包含子字符串toCharArray()将字符串转成数组in......
  • DevStyle,一个让Java开发更现代化的工具!
    如果您喜欢Eclipse的强大功能,但对它的可用性和美观度没有很高的要求,那么从今天开始,请准备好从全新的角度来看待Eclipse。在之前暗黑的插件基础上,MyEclipse官方团队为大家带......
  • java (11)方法的重写和super
    1、重写:在Java和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这......
  • Java(11)super 和 this
    一、this概念:this代表着当前对象的引用,this代表的是执行者,this本质是一个执行当前对象的指针 最常见的情况是是对象的属性因为与构造器参数同名而被构造器参数屏蔽时,......
  • 读Java8函数式编程笔记06_Lambda表达式编写并发程序
    1. 阻塞式I/O1.1. 一种通用且易于理解的方式,因为和程序用户的交互通常符合这样一种顺序执行的方式1.2. 将系统扩展至支持大量用户时,需要和服务器建立大量TCP连接,因此......
  • Java(10)成员变量和局部变量
    1、声明的位置局部变量:方法体{}中,形参,代码块中成员变量:类中方法外  ①、类变量:有static修饰  ②、实例变量:没有stati......
  • Java(9)类/对象/接口
    一.Java是面向对象的编程语言,对象就是面向对象程序设计的核心。所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种......
  • java(8)访问修饰符
    1.1public任何其它类、对象只要可以看到这个类的话,那么它就可以存取变量的数据,或使用方法只有在使用public访问修饰符时,类的成员才可被同一包或不同包中的所有类访问。......
  • java(7)
    封装封装是JAVA面向对象的特点的表现,封装是一种信息隐蔽技术。它有两个含义:即把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位;以及尽可能隐藏对象的内......