2013-11-27 62 views
0

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

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

  • '\m'
  • '{0,1,2}'

另一个正则表达式需要的'{0,1,2}'值,并具有3个匹配:

  • 0
  • 1
  • 2

这些值是对应于所述byteArr PARAMS索引。

这个命令结构很可能会增长,所以我真的想弄明白这一点,并学习到足以能够修改正则表达式以满足未来的需求。我认为一个正则表达式可以完成上述所有操作,但在那里是有两个单独的 正则表达式(es/ices ???) 表达式的值。

任何方式,以获得第一组'\m'的正则表达式是:

"(\\)(\w{1,1})" // I want the '{0,1,2}' group also 

为了得到整数匹配'{0,1,2}'我尝试:

"(?<=\{)([^}]*)(?=\})" 

我有实现难度:( 1)第一个表达式上的2个组和(2) 3个大括号内的整数与第二个表达式中的逗号分隔ñ。

回答

0

你的第一个正则表达式(\\)(\w{1,1})可以大大简化。

  • 你不想单独捕获\m因此没有必要将它们包装在自己套括号。
  • \w{1,1}\w相同。

所以我们有​​匹配第一部分\m

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

但让我们假设这个例子实际上可能是\9{1,2,3}。我们可以使用[{,](\d+)[,}]。这表示捕获一个数字,其左侧有,{,右侧有,}

你在说,我们可以将整个字符串用一个正则表达式匹配是正确的,这样的事情会做到这一点:

(\\\w){((\d+),?)+}  

但是这个问题是当您检查拍摄的内容之后,(\d+)捕获的最后一个数字将覆盖所有其他在该处捕获的值。所以你会留下组1:\m和组2:2为例。

考虑到这一点,我建议使用2个regexs:

对于第1部分:​​

对于数:我忘了[{,](\d+)[,}](和许多其他的方法你可以做到这一点)最简洁的方法可能就是抓住{...}中的任何内容,然后再与简单的\d+匹配。

因此,要做到这一点首先使用(\\\w)\{([^/}]+)\}\m成组1和1,2,3成2组,那么就使用上\d+

仅供参考,您的(?<=\{)([^}]*)(?=\})工作正常,但您只能看到任何东西之前,即​​。

我的正则表达式\{([^/}]+)\}几乎是一样的,你(?<=\{)([^}]*)(?=\})除了不向前看和:在绝大多数地方可以使用回顾后发的情况下,你可以只使用捕捉组,而忽略其他一切你想要什么在后面寻找{}我只是将它们留在将要使用的捕获组之外。

0

考虑下面的正则表达式...

(^.*?)(?={.*}) 
\d+ 

祝您好运!

相关问题