Kotlin中如何用正则同时匹配#和&实现substringBefore截取效果
实现方法
你不需要写多层if分支判断,核心逻辑是找到字符串中第一次出现#或&的位置,直接截取该位置之前的内容即可。正则[#&]就可以同时匹配这两个字符,它属于正则字符组语法,会匹配两个字符中最先出现的那一个,和你原有分支判断的逻辑完全一致。
不同常用场景的实现代码如下:
- Kotlin 标准库实现:
val splitRegex = Regex("[#&]") // 如果两个字符都不存在,直接返回完整原字符串 val result = myString.take(splitRegex.find(myString)?.range?.first ?: myString.length)
- Java + Apache Commons Lang3 实现(最简洁,直接用工具类自带的正则截取方法):
String result = StringUtils.substringBeforePattern(myString, "[#&]");
- 纯Java原生实现,不需要额外依赖:
int hashPos = myString.indexOf('#'); int ampPos = myString.indexOf('&'); int splitPos = Math.min( hashPos == -1 ? myString.length() : hashPos, ampPos == -1 ? myString.length() : ampPos ); String result = myString.substring(0, splitPos);
注意:不建议用
myString.split("[#&]")[0]的写法实现,该方法会把整个字符串全量切分成数组,相比直接找匹配位置截取的方案性能更差。
以上所有写法都自动处理了两个字符都不存在的兜底场景,会直接返回原字符串,不需要额外写contains判断。
内容的提问来源于stack exchange,提问作者Evyatar Cohen
相关产品推荐
相关产品推荐

