使用正则表达式在逗号、空格或分号分隔的字符串上进行Split()操作。

21

我试图拆分一个由逗号、空格或分号分隔的字符串。每个分隔符后面可能还包含一个或多个空格。例如:

22222,11111,23232 
OR
22222, 11111, 23232 
OR
22222;     11111; 23232
OR
22222 11111 23232 

任意一个都会生成一个包含三个值的数组 ["22222","11111","23232"]

目前我有以下代码 var values = Regex.Split("22222, 11111, 23232", @"[\\s,;]+") 但这会导致第二和第三个值包括空格的数组,如下所示:

["22222"," 11111"," 23232"]
5个回答

38

你有两种选择:

在这种情况下,您想要通过特定的分隔符字符拆分字符串。 String.Split 特别为此目的而创建。这种方法比 Regex.Split 更快。

char[] delimiters = new [] { ',', ';', ' ' };  // List of your delimiters
var splittedArray = myString.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

请解释一下你的评论“不要使用正则表达式来分割字符串,应该使用String.Split方法”。 - bflemi3
3
在这种情况下,分隔符非常简单(只有不同的字符),String.Split 已经被创建出来用于这个特殊目的:将字符串分割成由定义的字符分隔的多个字符串。我认为在这种情况下使用 String.Split 比使用 Regex.Split 更快。 - Cédric Bignon
1
如果你没有第一句话的“不要使用正则表达式”的限制,并且至少提供了一个正则表达式作为替代方案,那么这将是一个非常好的答案。例如,我通过谷歌搜索找到了同样的问题的答案,而我正在使用JavaScript而不是C#。 - Bitterblue
虽然有些晚了,但是值得一提的是,\s 不仅仅代表空格字符。它还代表换页符 \u000C、换行符 \u000A、回车符 \u000D、制表符 \u0009、垂直制表符 \u000B、省略号或下一行(NEL)字符(…)\u0085,以及任何分隔符字符(\u0020\u00A0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000)。https://msdn.microsoft.com/zh-cn/library/20bw873z.aspx#Anchor_7 - JDB

8
你在字符串中使用了 @ 符号,因此 "\" 被解释为一个斜杠。所以你的字符类实际上被读作 "\""s""," 或者 ";"。去掉多余的斜杠,就可以得到预期的结果:
var values = Regex.Split("22222, 11111, 23232", @"[\s,;]+")

2
Regex.Split("22222, 11111, 23232", @"[ ,;]+")

这个方法对我很有帮助。

如果你只是需要根据几个字符分隔符拆分字符串,建议查看下面的答案 - 使用 string.split 可能是更好的解决方案。


1

如果要字面理解"I'm trying to split a string that can either be comma, space or semi-colon delimited. It could also contain a space or spaces after each delimiter",可以尝试以下方法:

@"[,;]\s*|\s+"

这个属性的作用是连续的分隔符(除了空格)不会被视为单个分隔符。
但是如果你想让所有连续的分隔符被视为一个,那么也可以这样做:
@"[,;\s]+"

当然,在这种情况下,正如其他人所指出的那样,string.Split是一个更简单的选项。

0

尝试使用这个正则表达式模式:

([^,;\"\}\{\s*.]\d+)

关于示例文本:

{"123","456","789"}
1011,1213,1415
16, 17, 181920
212223;        242526;27
28 29 3031 

查看演示

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接