为什么这个正则表达式在最后一个匹配

时间:2012-10-27 15:47:23

标签: c# regex

我有这个恢复的动画数据列表,其中包含最具代表性的格式:

    * » iddle 1-210
    * » run01 215-252
    * » stand up 876-987
0   -      = bindpose
1   - 48   = idle
118 - 150  = attack_idle
151 - 192  = attack 1
791 - 815  = strafe right
000 - 009 T-pose
010 - 040 walk
045 - 075 walk-back
080 - 110 walk-right-45
490 - 590 idle-1
1060 - 1120 spell-cast_01
1515 - 1590 sack_pick_up

我在想如何匹配动画名称......

我已经制作了这种匹配模式,

 ([a-zA-Z][\w- _]+)

返回

1: iddle 1-210
1: run01 215-252
1: stand up 876-987
1: bindpose
1: idle
1: attack_idle
1: attack 1
1: strafe right
1: T-pose
1: walk
1: walk-back
1: walk-right-45
1: idle-1
1: spell-cast_01
1: sack_pick_up

为避免三个起始匹配包含数字,我试过这个:

 ([a-zA-Z][\w- _]+)(?:\s\d+\s*[-]*\s*\d\s*)

但它与最后一行不匹配:

1: iddle
1: run01
1: stand up
1: bindpose
1: idle
1: attack_idle
1: attack 1
1: strafe right
1: T-pose
1: walk
1: walk-back
1: walk-right-45
1: idle-1
1: spell-cast_01

为什么呢?

我认为与(?= \ s 有关,但我还没有找到解决方法......

编辑:修正'|'括号之间

3 个答案:

答案 0 :(得分:1)

使用正则表达式

[a-zA-Z][\w-]*(\s+(?:[a-zA-Z]|\d(?!\d*-))[\w-]*)*

答案 1 :(得分:1)

我认为您的所有其他行都能够与\s的换行符和1的下一行\d+匹配,这在最后一行是不可能的。这是一个不同的选择:

如果使用多线选项(在C#中,您可以使用参数RegexOptions.Multiline提供匹配功能),$将匹配线的末尾。然后你可以做这样的事情:

([a-zA-Z][\w -]+)(?:\s\d+\s*-*\s*\d+)?$

这使得末尾的数字部分是可选的,但断言之后必须有一个行结束。

请注意,我从字符类中删除了_,因为它已经是\w的一部分。我也将[-]更改为-,因为它是等效的。

答案 2 :(得分:0)

使用此正则表达式仅捕获group1

中的名称
^.*?([a-zA-Z][\w -]+?)(?:(?:\s*\d+-\d+)?)$

使用multiline模式


正则表达式中的

错误

由于_包含[\w- _]

,因此不需要\w中的_

\w-中的[\w- _]错误,因为您指定了\w和空格之间的范围。

应该是[\w -],因为-用于开始结尾时,字符类没有任何特殊含义