我想匹配逗号分隔的任意三个数字,并且可以用括号开头和结尾。
有效示例是: {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();
}
但是我在上面的第一个代码行上遇到了运行时错误。
有什么建议吗?匹配这种表达的最佳方法是什么?
答案 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#)。幸运的是,解决所有这些问题应该很容易。
您可以.Replace( "regex", "")
使用这些正则表达式:[{}]
,[\[\]]
,[)(]
来删除大括号。如果在循环中执行此操作(3次迭代,每个正则表达式一次),则可以将原始长度与新字符串的长度进行比较。如果长度差异为1,则表示您找到了不匹配的内容,并且您可以直接检查下一场比赛。匹配通过所有三次迭代后,.Split
在逗号上,.Trim
空格,最后,将数字添加到数组中。
答案 1 :(得分:-1)
试试这个
[{|(|[)?\d+,\d+,\d+(}|)|]]?