Java 11中如何高效实现符合规则的字符串连字符插入转换
Java 11中如何高效实现符合规则的字符串连字符插入转换
嘿,这个需求挺有意思的!你已经搞定了关键的输入验证环节,接下来的连字符插入其实有两种高效的实现方式,我给你详细拆解下:
方式一:用正则表达式快速替换(最简洁)
Java的String.replaceAll方法配合精心编写的正则,可以一行代码搞定插入逻辑,而且底层是JDK优化过的正则引擎,效率完全够用。
核心思路是匹配需要插入连字符的边界位置,这些位置满足以下任意一种情况:
- 小写字母紧跟大写字母(或反之,大小写切换)
- 字母紧跟数字(或反之,类型切换)
对应的正则表达式如下:
String hyphenRegex = "(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z])|(?<=[a-zA-Z])(?=[0-9])|(?<=[0-9])(?=[a-zA-Z])";
把它整合到你的方法里,完整代码如下:
public String hyphenate(String input) { // 输入验证:确保只包含字母数字 if (!input.matches("[a-zA-Z0-9]+")) { throw new IllegalArgumentException("Illegal! $ not allowed!"); } // 匹配需要插入连字符的边界,替换为"-" String hyphenRegex = "(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z])|(?<=[a-zA-Z])(?=[0-9])|(?<=[0-9])(?=[a-zA-Z])"; return input.replaceAll(hyphenRegex, "-"); }
测试你给出的案例:
flimFlam→flim-FlamfliMflam→fliM-flamfliM8fLam→fli-M-8-f-Lam
完全符合预期!
方式二:手动遍历字符构建(直观可控)
如果你觉得正则不够直观,或者需要处理超大字符串(正则引擎有微小的额外开销),可以用StringBuilder手动遍历字符,逐个判断是否需要插入连字符:
public String hyphenate(String input) { // 输入验证 if (!input.matches("[a-zA-Z0-9]+")) { throw new IllegalArgumentException("Illegal! $ not allowed!"); } if (input.length() <= 1) { return input; // 单个字符无需处理 } StringBuilder sb = new StringBuilder(); char prevChar = input.charAt(0); sb.append(prevChar); for (int i = 1; i < input.length(); i++) { char currChar = input.charAt(i); // 判断是否大小写切换:用异或,一个小写一个大写时为true boolean caseChanged = Character.isLowerCase(prevChar) ^ Character.isUpperCase(currChar); // 判断是否类型切换:一个字母一个数字时为true boolean typeChanged = Character.isLetter(prevChar) ^ Character.isDigit(currChar); if (caseChanged || typeChanged) { sb.append('-'); } sb.append(currChar); prevChar = currChar; } return sb.toString(); }
这种方式逻辑清晰,每一步都可控,性能也很出色,适合对底层细节有要求的场景。
两种方式对比
- 正则方式:代码极简,可读性依赖正则功底,适合大多数常规场景
- 手动遍历:代码稍长,但逻辑直观,性能略优(差异极小,除非处理百万级长度的字符串)
你可以根据自己的代码风格和业务场景选择~
备注:内容来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

