我有这个恢复的动画数据列表,其中包含最具代表性的格式:
* » 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 有关,但我还没有找到解决方法......
编辑:修正'|'括号之间答案 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 -]
,因为-
用于开始或结尾时,字符类没有任何特殊含义