String.Split()函数

正确使用C#中的string.Split方法
本文详细解析了C#中string.Split方法的各种用法及注意事项,包括如何正确指定分隔符、如何处理空字符串元素等,并通过具体示例展示了不同重载函数的应用场景。

我们在上次学习到了 String.Join函数(http://blog.csdn.net/zhvsby/archive/2008/11/28/3404704.aspx),其中用到了String.SPlit函数,所以可以上网查了该函数的使用方法 如下:

 

#中使用string.Split方法来分割字符串的注意事项:
string.Split
给我们提供了非常灵活的使用方式, 但是如果使用不当, 会造成错误, 最近在做code review, 看到大部分人这么使用:
            string s = "A|B|:|C:D";
            string[] ss = s.Split("|:|".ToCharArray());
            //ss[0]: A
            //ss[1]: B
            //ss[2]:
            //ss[3]:
            //ss[4]: C
            //ss[5]: D
其实他的本意是使用|:|将字符串分开的, 目标是为了得到数组: A|B C:D, 但是没有直接找到Split(string)的重载, 所有就是用了ToCharArray(), 很显然, 得到的结果是错误的.

正确的用法为:
            string[] ss1 = s.Split(new[] {"|:|"}, StringSplitOptions.None);
            //ss1[0]: A|B
            //ss1[1]: C:D

后一个参数, 是标志是否自动remove empty的数据. 例如: "A|B|:|C:D|:|" 做分割时, 会返回三个数组, 该数组的最后一个元素是空"", 如果我们想过滤掉这些空的元素, 可以使用参数: StringSplitOptions.RemoveEmptyEntries : string[] ss1 = s.Split(new[] {"|:|"}, StringSplitOptions.RemoveEmptyEntries);

例子:

            s = "A|B|:|C:D|:|";
            string[] ss1 = s.Split(new[] {"|:|"}, StringSplitOptions.RemoveEmptyEntries);
            //ss1[0]: "A|B"
            //ss1[1]: "C:D"

            ss1 = s.Split(new[] { "|:|" }, StringSplitOptions.None);
            //ss1[0]: "A|B"
            //ss1[1]: "C:D"
            //ss1[2]: ""

 

首先我们看下String.Split 方法有6个重载函数:

1) public string[] Split(params char[] separator)
2) public string[] Split(char[] separator, int count)
3) public string[] Split(char[] separator, StringSplitOptions options)
4) public string[] Split(string[] separator, StringSplitOptions options)
5) public string[] Split(char[] separator, int count, StringSplitOptions options)
6) public string[] Split(string[] separator, int count, StringSplitOptions options)
下边我们通过一些实例来说明下怎么使用(以下string words = "1,2.3,,4";):

1. public string[] Split(params char[] separator)
程序代码 程序代码
string[] split = words.Split(new Char[] { ',' });//返回:{"1","2.3","","4"}
string[] split = words.Split(new Char[] { ',', '.' });//返回:{"1","2","3","","4"}

2. public string[] Split(char[] separator, int count)
程序代码 程序代码
string[] split = words.Split(new Char[] { ',', '.' }, 2);//返回:{"1","2.3,,4"}
string[] split = words.Split(new Char[] { ',', '.' }, 6);//返回:{"1","2","3","","4"}

3. public string[] Split(char[] separator, StringSplitOptions options)
程序代码 程序代码
string[] split = words.Split(new Char[] { ',', '.' }, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2","3","4"} 不保留空元素
string[] split = words.Split(new Char[] { ',', '.' }, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素

4. public string[] Split(string[] separator, StringSplitOptions options)
程序代码 程序代码
string[] split = words.Split(new string[] { ",", "." }, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2","3","4"} 不保留空元素
string[] split = words.Split(new string[] { ",", "." }, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素

5. public string[] Split(char[] separator, int count, StringSplitOptions options)
程序代码 程序代码
string[] split = words.Split(new Char[] { ',', '.' }, 2, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2.3,,4"} 不保留空元素
string[] split = words.Split(new Char[] { ',', '.' }, 6, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素

6. public string[] Split(string[] separator, int count, StringSplitOptions options)
程序代码 程序代码
string[] split = words.Split(new string[] { ",", "." }, 2, StringSplitOptions.RemoveEmptyEntries);//返回:{"1","2.3,,4"} 不保留空元素
string[] split = words.Split(new string[] { ",", "." }, 6, StringSplitOptions.None);//返回:{"1","2","3","","4"} 保留空元素

个人理解:Split 就是和String.Join相反的一个函数 它的作用是把一个字符串分隔成含有多个字段的数组
我现在只对上面的一种方法进行分析:
string[] split = words.Split(new Char[] { ',', '.' }, 6);//返回:{"1","2","3","","4"}
为什么返回的有了个空的“” 呢,自己当时也是不理解
其实它就是以" , " 和“ . " 两个分隔符来拆分 字符串 1,2.3,,4的 当找到 3 后面的第一个”, “ 时候说明此处要分开了
但是它后面又是一个分隔符 ”, " 怎么办呢 这是就只能当成 " " 空来处理了  你可以变相的把  1,2.3,,4连续的两个" , "间 认为有个空格符“ “也可以。不对的地方请大家帮指出来 不胜感激 。


 


`split` 函数在不同的数据库系统中都有应用,主要用于将字符串按照指定的分隔符分割成数组。以下以 Trino 和 StarRocks 为例介绍其使用方法。 ### Trino 中的 split 函数 在 Trino 中,`split` 函数的基本语法为:`split(string, delimiter)`。其中,`string` 是要分割的字符串,`delimiter` 是用于分割的分隔符。 示例 SQL: ```sql -- 将字符串 'apple,banana,orange' 按逗号分割成数组 SELECT split('apple,banana,orange', ','); ``` 上述 SQL 会返回一个数组 `['apple', 'banana', 'orange']`。 若要访问分割后数组中的某个元素,可以使用 `[index]` 的方式,索引从 1 开始。例如: ```sql SELECT split('apple,banana,orange', ',')[2]; ``` 此 SQL 会返回 `banana`。 ### StarRocks 中的 split 函数 StarRocks 中 `split` 函数的使用方法和 Trino 类似,基本语法同样为 `split(string, delimiter)`。 示例 SQL: ```sql -- 将字符串 'hello world' 按空格分割成数组 SELECT split('hello world', ' '); ``` 会返回数组 `['hello', 'world']`。 访问数组元素也使用 `[index]` 的方式,索引同样从 1 开始。例如: ```sql SELECT split('hello world', ' ')[1]; ``` 会返回 `hello`。 ### 适用场景 - **数据清洗**:当数据中包含复合信息,例如地址信息可能包含省份、城市、街道等,用分隔符连接在一起,可使用 `split` 函数将其拆分成多个部分,方便后续处理和分析。 - **数据提取**:从字符串中提取特定部分的信息。例如,从 URL 中提取参数值,可先将 URL 按 `&` 分割,再进一步处理。 - **数据转换**:将字符串类型的数据转换为数组类型,以便进行数组相关的操作,如数组元素的筛选、排序等。 ### 差异性 在 Trino 419 和 StarRocks 3.2.8 中,执行 `select split(',',',')[1] as t1` 和 `select coalesce(split(',',',')[1],'--') as t1` 会得到不同的结果,这体现了两个系统在处理边界情况时的差异 [^1]。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值