C# 要分析格式化程序字符串的正则表达式

C# 要分析格式化程序字符串的正则表达式,c#,regex,C#,Regex,我正在编写一个类似字符串.Format的方法。为了做到这一点,我采用正则表达式来确定命令和参数:例如格式(@“\m{0,1,2}”、byteArr0、byteArr1、byteArr2) 对于第一个正则表达式,返回2个组: '\m' '{0,1,2}' 另一个正则表达式的值为“{0,1,2}”,有3个匹配项: 0 1 2 这些值是与byteArr参数相对应的索引 这个命令结构可能会增长,所以我真的想弄清楚这一点,并学习足够多的知识,以便能够修改正则表达式以满足未来的需求。我认为一个正则表

我正在编写一个类似
字符串.Format
的方法。为了做到这一点,我采用正则表达式来确定命令和参数:例如
格式(@“\m{0,1,2}”、byteArr0、byteArr1、byteArr2)

对于第一个正则表达式,返回2个组:

  • '\m'
  • '{0,1,2}'
另一个正则表达式的值为
“{0,1,2}”
,有3个匹配项:

  • 0
  • 1
  • 2
这些值是与
byteArr
参数相对应的索引

这个命令结构可能会增长,所以我真的想弄清楚这一点,并学习足够多的知识,以便能够修改正则表达式以满足未来的需求。我认为一个正则表达式可以完成上述所有工作,但拥有两个单独的正则表达式(es/ices???)是有价值的

无论如何,要获取第一个组
'\m'
,正则表达式是:

"(\\)(\w{1,1})"  // I want the '{0,1,2}' group also 
要获取整数匹配项
“{0,1,2}”
,我正在尝试:

"(?<=\{)([^}]*)(?=\})"
(?您的第一个正则表达式
(\\)(\w{1,1})
可以大大简化

  • 您不希望将
    \
    单独捕获到
    m
    ,因此无需将它们封装在自己的括号中
  • \w{1,1}
    与刚才的
    \w
    相同
因此,我们有
\\\w
来匹配第一部分
\m

现在来处理第二部分,实际上我们可以忽略示例中除
0,1,2
之外的所有内容,因为其他地方没有数字,所以您只需使用:
\d+
并迭代匹配

但是让我们假设这个例子实际上可能是
\9{1,2,3}

现在
\d+
将匹配
9
,因此为了避免这种情况,我们可以使用
[{,](\d+[,}]
。这表示捕获一个数字,该数字的左边是
{
,右边是

你说得对,我们可以用一个正则表达式匹配整个字符串,类似这样的东西可以做到:

(\\\w){((\d+),?)+}    
但是,问题是,当您事后检查捕获组的内容时,
(\d+)
捕获的最后一个数字将覆盖在其中捕获的所有其他值。因此,对于您的示例,只剩下组1:
\m
和组2:
2

考虑到这一点,我建议使用2个正则表达式:

对于第一部分:
\\\w

对于数字:我忘记了
[{,](\d+[,}]
(以及其他许多方法),最干净的方法可能就是抓取
{…}
中的任何内容,然后与一个简单的
\d+
匹配

为此,首先使用
(\\\w)\{([^/}]+\}
\m
抓取到第1组,将
1,2,3
抓取到第2组,然后使用
\d+


仅供参考,您的
(?考虑以下正则表达式

(^.*?)(?={.*})
\d+
祝你好运