正则表达式分裂刺痛

时间:2013-03-13 15:22:20

标签: c# regex

我有一个字符串 [123234321,...]

我可以使用正则表达式只提取数字吗?

这是我现在使用的代码

 public static string[] Split()
    {
        string s = "[123,234,345,456,567,678,789,890,100]";
        var temp = s.Replace("[", "").Replace("]", "");
        char[] separator = { ',' };
        return temp.Split(separator);

    }

6 个答案:

答案 0 :(得分:2)

您可以使用string.Split - 不需要正则表达式,但您的代码可以简化:

var nums = s.Split('[', ']', ',');

您可能希望在返回的数组中排除空条目:

var nums = s.Split(new[] { '[', ']', ',' }, 
                   StringSplitOptions.RemoveEmptyEntries);

答案 1 :(得分:1)

Trim()有一个带有字符的重载。

你可以这样做。

string s = "[123,234,345,456,567,678,789,890,100]";
var nums = s.Trim('[').Trim(']').Split(',');

答案 2 :(得分:1)

如果您想使用正则表达式,请尝试:

string s = "[123,234,345,456,567,678,789,890,100]";            
var matches = Regex.Matches(s, @"[0-9]+", RegexOptions.Compiled);   

但是,正则表达式往往会降低您的代码的可读性,因此您可能会坚持使用原始方法。

答案 3 :(得分:0)

尝试使用string.Split方法;

string s = "[123,234,345,456,567,678,789,890,100]";
var numbers = s.Split('[',']', ',');
foreach(var i in numbers )
   Console.WriteLine(i);

这是DEMO

编辑:作为Oded mentioned,您可能也想使用StringSplitOptions.RemoveEmptyEntries

答案 4 :(得分:0)

string s = "[123,234,345,456,567,678,789,890,100]";
MatchCollection matches = Regex.Matches(s, @"(\d+)[,\]]");
string[] result = matches.OfType<Match>().Select(m => m.Groups[1].Value).ToArray();

此处@用于表示逐字字符串文字,并允许转义字符'\'直接用于正则表达式表示法而不转义为“\”。

\d是一个数字,\d+表示1位或更多位数。括号表示一个组,(\d+)表示我想要一组数字。 (*见组稍后使用)

简而言之,

[,\]]方括号表示选择我的元素中的任何一个,因此它将选择逗号,或方括号],我必须逃避。

因此,正则表达式将找到连续数字的表达式,后跟,]。匹配将返回匹配集(我们使用因为有多个集合)然后我们通过每个匹配 - 使用一些LINQ - 并获取索引1组,这是第二组,“但我们只创建了一个组?”我们只指定了一个组,第一个组(索引0)是整个正则表达式匹配,在我们的例子中,它将包括我们不想要的,]

答案 5 :(得分:0)

虽然你可以并且可能应该使用string.Split,因为其他答案表明,问题特别询问你是否可以用正则表达式来做,是的,你可以: -

var r = new Regex(@"\d+", RegexOptions.Compiled );
var matches = r.Matches("[123,234,345,456,567,678,789,890,100]");