Java 中存在连续大写字母时如何将驼峰式大小写转换为小连字符

问题描述 投票:0回答:3

我有字符串“B2BNewQuoteProcess”。当我使用 Guava 从 Camel Case 转换为 Lower Hyphen 时,如下所示:

CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN,"B2BNewQuoteProcess");

我得到“b2-b-new-quote-process”。

我正在寻找的是“b2b-new-quote-process”...

如何在 Java 中执行此操作?

java regex guava
3个回答
12
投票

编辑

为了防止在行首出现

-
,请使用以下内容代替我原来的答案:

(?!^)(?=[A-Z][a-z])

代码

请参阅此处使用的正则表达式

(?=[A-Z][a-z])

更换:

-

注意:上面的正则表达式不会将大写字符转换为小写;它只是将

-
插入到应该有它们的位置。大写字符到小写字符的转换发生在下面的 Java 代码中,使用
.toLowerCase()

使用方法

查看此处使用的代码

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        final String regex = "(?=[A-Z][a-z])";
        final String string = "B2BNewQuoteProcess";
        final String subst = "-";
        
        final Pattern pattern = Pattern.compile(regex);
        final Matcher matcher = pattern.matcher(string);
        
        // The substituted value will be contained in the result variable
        final String result = matcher.replaceAll(subst);
        
        System.out.println("Substitution result: " + result.toLowerCase());
    }
}

说明

  • (?=[A-Z][a-z])
    正向先行确保后面是大写 ASCII 字母,后跟小写 ASCII 字母。这用作该位置的断言。替换只需将连字符
    -
    插入与此前瞻匹配的位置即可。

1
投票

适用于JAVA 8以下版本的方法

使用此方法可以转换任何驼峰式大小写字符串。您可以选择任何类型的分隔符。

private String camelCaseToLowerHyphen(String s) {
    StringBuilder parsedString = new StringBuilder(s.substring(0, 1).toLowerCase());
    for (char c : s.substring(1).toCharArray()) {
      if (Character.isUpperCase(c)) {
        parsedString.append("_").append(Character.toLowerCase(c));
      } else {
        parsedString.append(c);
      }
    }
    return parsedString.toString().toLowerCase();
  }
}

原始代码取自:http://www.java2s.com/example/java-utility-method/string-camel-to-hyphen-index-0.html


1
投票
骆驼箱 下连字符 应该是
B2B新报价流程 b2-b-新报价流程 b2b-新报价流程
BaB新报价流程 ba-b-新报价流程
B2新报价流程 b2-新报价流程
BAB新报价流程 b-a-b-新报价流程 bab-新报价流程

所以:

  • 大写字母后面的数字也算大写
  • N+1 个“大写字母”,前 N 个大写字母组成一个单词

错误结果的修复将是:

String expr = "b2-b-new-quote-process";
expr = Pattern.compile("\\b[a-z]\\d*(-[a-z]\\d*)+\\b")
    .matcher(expr).replaceAll(mr ->
        mr.group().replace("-", ""));

这会在单词边界 (

\b
) 之间搜索包含任何数字的字母序列,后跟重复的连字符加字母和任何数字。


回答迟到(请不要再点赞了!)

private static String convert(String s) {
    return s.replaceAll("[a-z]+[0-9]*|[A-Z][a-z]+[0-9]*", "-$0-")
            .replaceFirst("^[-]+", "")
            .replaceFirst("[-]+$", "")
            .replaceAll("[-][-]+", "-")
            .toLowerCase();
}

我似乎被叫离了我的电脑,再也没有回来,但仍然“回答”了(因为细致的 HTML 表格。

这里有一个简化的全新答案。

检测组

  • 小写字母加尾随数字 `"abc123",
  • 或一个大写字母,然后是小写字母加上尾随数字 `"Aabc123"。

另一种情况是大写加数字混合。由于标识符不以数字开头,因此不需要对结果进行更具体的分类:它是作为组的余数

它也会进行转换

  • B2new3quote
    b2-new3-quote
© www.soinside.com 2019 - 2024. All rights reserved.