Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)

Posted 高、远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)相关的知识,希望对你有一定的参考价值。

【1】功能(驼峰转下划线)

  1. 只遍历输入字符串一遍
  2. 能够处理处理连续的大写字母如 HTTP
  3. 首字母可大写可小写
/**
     * 双指针法
     * l之前的表示已经转换过的字符
     * l-r之间的表示需要被转换的单词
     * r之后表示还没有循环到的字符
     *
     * @param s 传入的字符串
     * @return
     */
    public static StringBuilder trans(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        int l = 0;
        int r = 0;
        while (r < s.length()) {
            //如果下一个字符是小写
            if (r + 1 < s.length() && !isUpper(s.charAt(r + 1))) {
                while (true) {
                    r++;
                    if (r == s.length()) {
                        stringBuilder.append(s.substring(l).toLowerCase());
                        return stringBuilder;
                    }
                    if (isUpper(s.charAt(r))) {
                        stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                        l = r;
                        break;
                    }
                }
            } else if (r + 1 < s.length()) {//如果下个字符是连着的大写 如HTTP
                //判断是不是第一个字符,如果不判断则会出现aA 变为aa的情况 而不是a_a
                if (r == 0 && isUpper(s.charAt(r + 1))) {
                    r++;
                    stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                    l = r;
                } else {
                    while (true) {
                        r++;
                        if (r == s.length()) {
                            stringBuilder.append(s.substring(l).toLowerCase());
                            return stringBuilder;
                        }
                        if (!isUpper(s.charAt(r))) {
                            r--;
                            stringBuilder.append(s.substring(l, r).toLowerCase() + "_");
                            l = r;
                            break;
                        }
                    }
                }
            } else {//如果是到达最后了
                stringBuilder.append(s.substring(l).toLowerCase());
                r++;
            }
        }
        return stringBuilder;
    }

    public static boolean isUpper(char c) {
        return c >= 'A' && c <= 'Z';
    }

【2】测试用例

		System.out.println(trans(""));
        System.out.println(trans(" "));
        System.out.println(trans("isTrue"));
        System.out.println(trans("myFirstName"));
        System.out.println(trans("OnlineUsers"));
        System.out.println(trans("Address"));
        System.out.println(trans("validHTTPRequest"));
        System.out.println(trans("ValidHTTPSRequestCall"));
        System.out.println(trans("UsingHTTPS"));

输出:


 
is_true
my_first_name
online_users
address
valid_http_request
valid_https_request_call
using_https

【3】如果使用有Bug,欢迎评论区留言

以上是关于Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)的主要内容,如果未能解决你的问题,请参考以下文章

Java 驼峰命名转下划线命名(能正确处理连续HTTP等大写)

JAVA 小工具 驼峰命名转下划线命名 parsingCamelCaseToUnderline

JAVA 小工具 驼峰命名转下划线命名 parsingCamelCaseToUnderline

Oracle为啥不支持驼峰命名法

java实体类驼峰命名的好处在哪里??

java下划线与驼峰命名互转