我有字符串“B2BNewQuoteProcess”。当我使用 Guava 从 Camel Case 转换为 Lower Hyphen 时,如下所示:
CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_HYPHEN,"B2BNewQuoteProcess");
我得到“b2-b-new-quote-process”。
我正在寻找的是“b2b-new-quote-process”...
如何在 Java 中执行此操作?
为了防止在行首出现
-
,请使用以下内容代替我原来的答案:
(?!^)(?=[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 字母。这用作该位置的断言。替换只需将连字符 -
插入与此前瞻匹配的位置即可。适用于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
骆驼箱 | 下连字符 | 应该是 |
---|---|---|
B2B新报价流程 | b2-b-新报价流程 | b2b-新报价流程 |
BaB新报价流程 | ba-b-新报价流程 | |
B2新报价流程 | b2-新报价流程 | |
BAB新报价流程 | b-a-b-新报价流程 | bab-新报价流程 |
所以:
错误结果的修复将是:
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 表格。
这里有一个简化的全新答案。
检测组
另一种情况是大写加数字混合。由于标识符不以数字开头,因此不需要对结果进行更具体的分类:它是作为组的余数。
它也会进行转换
B2new3quote
至 b2-new3-quote