Druid的StringUtil的subString使用

今天在看Druid的源码时, 无意间看到StringUtil
里面的subString方法还挺有趣的 想到可以在算法比赛的时候模仿写着这方法
先上代码:

 /**
     * Example: subString("abcdc","a","c",true)="bcd"
     * 第四个参数表示是否到最后的一个c 这例子中 若为false则 结果为 b
     * @param src
     * @param start null while start from index=0
     * @param to null while to index=src.length
     * @param toLast true while to index=src.lastIndexOf(to)
     * @return
     */
    public static String subString(String src, String start, String to, boolean toLast) {
        if(!toLast) {
            return subString(src, start, to);
        }
        int indexFrom = start == null ? 0 : src.indexOf(start);
        int indexTo = to == null ? src.length() : src.lastIndexOf(to);
        if (indexFrom < 0 || indexTo < 0 || indexFrom > indexTo) {
            return null;
        }

        if (null != start) {
            indexFrom += start.length();
        }

        return src.substring(indexFrom, indexTo);

    }

正如示例
Example: subString(“abcdc”,“a”,“c”,true)="bcd"
第四个参数表示是否到最后的一个c 这例子中 若为false则 结果为 b
那么
Example: subString(“abcdc”,“ab”,“c”,true)="cd"
那么
Example: subString(“abcdc”,“bc”,“c”,true)="d"

算法显而易见 首先判断是否第四个参数为false(false表示不到最后一个“to”)
若此参数为false则跳转下面重载的方法2
然后再给indexFrom indexTo分别赋值 这个好理解
在下面 判断 null != start 若成立 则让 indexFrom变为加上start的长度的位置
意思即为 :除去"start"位置及之前的字母
若不加上这个判断 则只会从"start"开始取subString 并且包含start的字母
比如 StringUtils.subString(“abcdc”,“b”,“c”,true)="bcd"
只会从b开始并且包含b
StringUtils.subString(“dbcdc”,“db”,“c”,true)=“dbcd”
只会从db开始并且包含db

此外:
发现仍有一个问题即 若给定的start和to相同 并且 字符串的开头结尾也相同 并且将第四个参数改为false 则找不到
StringUtils.subString(“efcfee”, “e”, “e”, false);
会报java.lang.StringIndexOutOfBoundsException: begin 1, end 0, length 6
在这里插入图片描述
思考发现,
因为开始结束都一样 并且不说明“to”的e是最后一个 那么他会以为“to”是第一个e即end=0 , start=1(end=0 , start=1是因为 上面说的indexFrom += start.length();)
附:重载的方法2

 /**
     * Example: subString("abcd","a","c")="b"
     * 
     * @param src
     * @param start null while start from index=0
     * @param to null while to index=src.length
     * @return
     */
    public static String subString(String src, String start, String to) {
        int indexFrom = start == null ? 0 : src.indexOf(start);
        int indexTo = to == null ? src.length() : src.indexOf(to);
        if (indexFrom < 0 || indexTo < 0 || indexFrom > indexTo) {
            return null;
        }

        if (null != start) {
            indexFrom += start.length();
        }

        return src.substring(indexFrom, indexTo);

    }
@Bean protected SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { return httpSecurity // CSRF禁用,因为不使用session .csrf(csrf -> csrf.disable()) // 禁用HTTP响应标头 .headers((headersCustomizer) -> { headersCustomizer.cacheControl(cache -> cache.disable()).frameOptions(options -> options.sameOrigin()); }) // 认证失败处理类 .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler)) // 基于token,所以不需要session .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // 注解标记允许匿名访问的url .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 requests.antMatchers("/login", "/register", "/captchaImage").permitAll() .antMatchers("/app/*").permitAll() .antMatchers("/app/minLogin").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); }) // 添加Logout filter .logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler)) // 添加JWT filter .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) // 添加CORS filter .addFilterBefore(corsFilter,
最新发布
03-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值