2016-11-22 163 views
0

我有一系列不同复杂程度的文件名。基本上,它们总是被[_] {ASSET} _ [OPTIONAL_DESCRIPTION] _v {######}。{EXT}分割。 ([]在这种情况下是可选的)。在这种格式下,每件作品都可以任意复杂。 (领先_s是任意)正则表达式匹配一个或多个组太多

character_thing_v001.md 
character_Description_v001.md 
character_Some_Long_Description_v001.md 
character_thing_with_additional_info_v001.md 
character_thing_with_additional_info_Description_v001.md 
character_thing_with_additional_info_More_Description_Info_v001.md 
character_with_additional_info_Complete234ly_arbitrary_Description_v001.md 
_character_thing_v001.md 
___character_Description_v001.md 
____character_Some_Long_Description_v001.md 
__character_thing_with_additional_info_v001.md 
__character_thing_with_additional_info_Description_v001.md 
___character_thing_with_additional_info_More_Description_Info_v001.md 

我做了一个预测先行断言,以单独的资产和说明,一切运行良好,直到最近,当我的老板在系统中扔扳手。现在我必须支持其惯例可能是“some_undercase”或“CAPS _ ###”的资产。我修改为允许A-Z并使descriptionText与任何内容匹配。这是混乱开始的地方。

 (?:[_]+)? 
    (?P<assetText>[a-zA-Z0-9]+ 
     (?=_[a-zA-Z0-9]+)? # lookahead and optionally assert _Capital 
     (?:(?:_[a-zA-Z0-9]+)+)? # match next group if it exists 
    ) # get full match 
    (?:[_]+)? 
    \_(?P<descriptionText>.+)? 
    \_v(?P<versionIncrement>\d+) 
    \.(?:\.)? 
     (?P<extension>(?:md|some|other|extension|options)) 

这让我的存在方式的一部分,但它有问题,你可以查看,here

现在,该资产能够有资金,先行匹配太多资产,并且开始进入的描述。这种模式是自动生成的几个模式之一,所以我正在寻找一种解决问题根源的方法,而不是写在问题的根源上。任何指导将非常感激,谢谢。

回答

1

我不能真正遵循似乎不必要的正则表达式的一些部分的逻辑。

是不是this simplified regex做同样的工作?

_* 
(?P<assetText>[a-zA-Z0-9]+(_[a-z_0-9]+)?) 
(_ (?P<descriptionText>[a-zA-Z0-9_]+) )? 
_v(?P<versionIncrement>[0-9]+) 
(?P<extension>\.[A-Za-z0-9]+) 

也许(自然语言)规则是什么构成了资产,什么是一个可选的描述需要澄清:

  • “资产”可以包含下划线(我假设而不是从第一句话中的模板)?
    • 如果是:“资产”结束和“描述”开始的位置的规则是什么?它是否总是以大写字母开始?
      • 如果是:大写字母可以和不能与“资产”一起出现的规则是什么?如果没有限制,那么资产和描述之间的分裂确实是不明确的。
+0

我会澄清和修改原来的职位。资产始终是under_case(例如:character_thing)或(现在)CAPS _ ###(例如:DOLL_101),说明是Capital_Case。所以仅仅获得一场比赛是不够的。每个部分必须以正确的点开始和结束。例如,用你的正则表达式,“character_thing_with_additional_info_More_Description_Info_v001.md ”的资产是“字符”,描述是“thing_with_additional_info_More_Description_Info”,而我正在寻找资产为“character_thing_with_additional_info”,描述为“More_Description_Info” – ColinKennedy

+0

因此要回答你的问题第二,是的,我同意,这个公约是不明确的。但我认为它基本上是“资产不足,在这种情况下,资产和描述之间的分割是第一个资本,除非它们是CAPS _ ###,在这种情况下,资产和描述之间的分割在数字之后,而不是第一个资本在描述中“。 – ColinKennedy

+0

好的,我已在'assetText'行添加了一个子表达式。我认为它现在可以完成你想要的工作 – jez