我有一系列不同复杂程度的文件名。基本上,它们总是被[_] {ASSET} _ [OPTIONAL_DESCRIPTION] _v {#####}。{EXT}拆分。 ([] s是可选的,在这种情况下)。但是在这种格式中,每一件都可以是任意复杂的。 (领先_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
我做了一个前瞻性断言,将ASSET和DESCRIPTION分开,一切正常,直到最近,当我的老板在系统中投入扳手。现在我必须支持其惯例可能是" 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
既然ASSET可以有大写字母,那么前瞻与ASSET匹配太多,并开始进入描述。这种模式是自动生成的几种模式之一,因此我正在寻找解决问题根源的方法,而不是围绕它编写。任何指导都会非常感谢,谢谢。
答案 0 :(得分: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]+)
可能需要澄清构成资产的内容的(自然语言)规则以及构成可选描述的内容: