[英]Regex to parse formatter string
我正在写一个string.Format
类的方法。 为此,我采用正则表达式来确定命令和参数:例如Format(@"\\m{0,1,2}", byteArr0, byteArr1, byteArr2)
对于第一个正则表达式,返回2组:
'\\m'
'{0,1,2}'
另一个正则表达式取值'{0,1,2}'
并具有3个匹配项:
0
1
2
这些值是对应于byteArr
参数的索引。
这个命令结构可能会增长,所以我真的想弄清楚这一点并学到足够的知识,以便能够修改Regex以满足将来的需求。我认为单个Regex可以满足上述所有要求,但是拥有价值2个独立的
Regex(es / ices ???)
表达式。
无论如何,要获取第一个组'\\m'
则表达式是:
"(\\)(\w{1,1})" // I want the '{0,1,2}' group also
为了获得整数匹配'{0,1,2}'
我正在尝试:
"(?<=\{)([^}]*)(?=\})"
我很难实现: (1)第一个表达式中有2个组,而(2)在第二个表达式中由逗号分隔的大括号内的整数上有3个匹配。
您的第一个正则表达式(\\\\)(\\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+
。
仅供参考,您的(?<=\\{)([^}]*)(?=\\})
可以正常工作,但您只能在后面隐藏\\\\\\w
之前进行任何操作。 在绝大多数情况下,可以使用向后查找,您可以通过使用捕获组并忽略其他所有内容来完成所需的操作:
我的正则表达式\\{([^/}]+)\\}
与您(?<=\\{)([^}]*)(?=\\})
几乎相同,只是前瞻和后瞻{
和}
我只是将它们留在将要使用的捕获组之外。
考虑以下正则表达式...
(^.*?)(?={.*})
\d+
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.