如何正确分割包含"_"(含双"_")的字符串?
嘿,我懂你碰到的这个麻烦——处理带单下划线甚至双下划线的字符串分割时,普通的分割方法往往会给出乱七八糟的结果,比如冒出一堆空字符串,完全不是你想要的样子。我给你整理了几个常用编程语言的解决方案,针对性解决这个问题:
Python 解决方案
如果你的需求是把连续的下划线(不管单/双)当作一个分隔符,同时可以忽略字符串首尾可能出现的下划线,用正则表达式的 re.split() 就非常靠谱:
import re # 示例字符串 s = "hello__world_python__foo" # 分割连续的下划线 result = re.split(r'_+', s) # 要是字符串首尾有下划线,会产生空元素,过滤掉即可 clean_result = [part for part in result if part] print(clean_result) # 输出: ['hello', 'world', 'python', 'foo']
这里的 r'_+' 表示匹配一个或多个连续的下划线,不管是单条还是双条下划线,都会被当作一个分隔符,自然不会产生多余的空元素。
JavaScript 解决方案
JS里有两种简单的处理方式,都能解决问题:
const s = "hello__world_python__foo"; // 方法1:用正则匹配连续下划线直接分割 const result1 = s.split(/_+/); // 方法2:先按单个下划线分割,再过滤掉空元素 const result2 = s.split('_').filter(part => part.length > 0); console.log(result1); // 输出: ['hello', 'world', 'python', 'foo'] console.log(result2); // 同样输出正确结果
两种方法都能避开连续下划线带来的空元素问题,你可以根据自己的习惯选。
Java 解决方案
Java里可以用原生正则,也可以借助工具类简化操作:
import java.util.ArrayList; import java.util.List; public class SplitExample { public static void main(String[] args) { String s = "hello__world_python__foo"; // 原生正则方式:匹配连续下划线分割 String[] result1 = s.split("_+"); // 手动过滤空元素(应对首尾有下划线的情况) List<String> partList = new ArrayList<>(); for (String part : s.split("_")) { if (!part.isEmpty()) { partList.add(part); } } String[] result2 = partList.toArray(new String[0]); // 借助Apache Commons Lang的StringUtils(更简洁) // 需要先引入依赖:org.apache.commons:commons-lang3 String[] result3 = org.apache.commons.lang3.StringUtils.split(s, '_'); // StringUtils.split会自动忽略连续分隔符,也不会保留空元素 } }
如果你的需求不是把连续下划线当成分隔符,而是有其他特殊要求(比如只分割单下划线,保留双下划线作为内容的一部分),可以再补充细节,我再给你调整方案~
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

