繁体   English   中英

正则表达式解析格式器字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM