使用regex c#从文本中拆分三个整数

时间:2016-03-22 08:50:41

标签: regex c#-4.0 split

我想匹配逗号分隔的任意三个数字,并且可以用括号开头和结尾。

有效示例是: {30,40,50},[30,40,50],(30,40,50)或30,40,50

它也可能是30,40,50(表示可以是逗号之后和三个数字之一之前的空格)

无效的例子是: {30,40,50或{30,40,50]

我希望之后只拆分整合。

我试过了:

Regex regex = new Regex(@"({|(|[)?\d+,\d+,\d+({|(|[)?");
Match match = regex.Match(laticeDim.Text);
if (match.Success)
{
    int[] integers = laticeDim.Text.Trim('{', '}', '[', ']', '(', ')').Split(',')
        .Select(s => Convert.ToInt32(s))
        .ToArray();

}

但是我在上面的第一个代码行上遇到了运行时错误。

有什么建议吗?匹配这种表达的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

错误说明

您收到错误是因为您忘记了特殊字符([。请注意,您正在结束正则表达式寻找打开大括号(为简单起见,我将其称为全部braces)在正则表达式的末尾(在我的答案中已修复)。

正则表达式解决方案

这个正则表达式应该更好:({|\(|\[)?\s*\d+,\s*\d+,\s*\d+\s*(}|\)|\])?

它和你的一样复杂(所以你应该理解它)。它也只是稍长一点。

以下是它的工作原理:

#Is there an opening brace?
(
    {|\(|\[
)?

#Find the numbers, even with spaces.
    #Note: currently, does not allow spaces between # and comma
\s*
\d+,\s*
\d+,\s*
\d+\s*

#Is there a closing brace?
(
    }|\)|\]
)?

对C#的更改

我的正则表达式会捕获你想要的和不需要的字符串,它也会破坏你当前的代码(我想,但我不知道C#)。幸运的是,解决所有这些问题应该很容易。

您可以.Replace( "regex", "")使用这些正则表达式:[{}][\[\]][)(]来删除大括号。如果在循环中执行此操作(3次迭代,每个正则表达式一次),则可以将原始长度与新字符串的长度进行比较。如果长度差异为1,则表示您找到了不匹配的内容,并且您可以直接检查下一场比赛。匹配通过所有三次迭代后,.Split在逗号上,.Trim空格,最后,将数字添加到数组中。

答案 1 :(得分:-1)

试试这个

[{|(|[)?\d+,\d+,\d+(}|)|]]?