4

我有这个具有代表性格式的恢复动画数据列表:

    * » 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相关,但我还没有找到解决方法...

编辑:修复了“|” 括号之间

4

3 回答 3

1

使用正则表达式模式

[a-zA-Z][\w-]*(\s+(?:[a-zA-Z]|\d(?!\d*-))[\w-]*)*
于 2012-10-27T16:12:40.573 回答
1

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

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

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

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

请注意,我_从字符类中删除了,因为它已经是\w. 我也[-]改为 -,因为它是等价的。

于 2012-10-27T16:13:27.143 回答
0

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

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

使用multiline方式


正则表达式中的错误

不需要_in因为包含[\w- _]\w_

\w-in是错误的,[\w- _]因为您指定了 和 之间的范围\w

应该是[\w -]因为在字符类的开头结尾-使用时没有任何特殊含义

于 2012-10-27T16:31:21.800 回答