我正在尝试使用正则表达式提取字符串的一部分。我对字符串有以下情况:
case1: Warehouse.13.season01episode01.hdtv.xor.avi
case2: Warehouse.13.s01e01.hdtv.xor.avi
case3: Warehouse.13.01x01.hdtv.xor.avi
上述字符串中的delimter(.)
可以由\s - _
替换。
我正在使用的逻辑是检查s or season
是否按数字预先(lookbehind)
在它之前提取所有东西,但由于后视需要绝对长度,我颠倒了字符串
并用它向前看。
现在对于case1我创建了以下正则表达式,它正常工作并输出Warehouse.13
。
.*?\d{1,2}e\d{1,2}s\.(?=\d+)(.*)
现在我使用了case2:
.*?\d{1,2}edosipe\d{1,2}nosaes\.(?=\d+)(.*) # works fine.
现在,当我尝试将上述两种情况+可选的分隔符组合起来时,如:
.*?\d{1,2}[e|edosipe]?[._ x\-]?\d{1,2}[s|nosaes]?[._\- ]?(?=\d+)(.*)
在上述情况下,您可以观察到大部分内容都是视觉上的(?)。这是为了 情形3。
使用上述正则表达式与case2的任何内容都不匹配,但适用于case1和case3。
知道这里有什么问题。
PS:我知道可能还有其他可能的字符串会违反上述正则表达式但是 目前对他们不感兴趣。
答案 0 :(得分:5)
[e|edosipe]
和[s|nosaes]
应为(e|edosipe)
和(s|nosaes)
,或(?:e|edopise)
和(?:s|nosaes)
抓住他们并弄乱你的会计$1
,$2
等
在这里,(...)
进行括号分组,就像在Perl中的任何其他表达式中一样。
[...]
定义了一个字符类。具体来说,[s|nosaes]
匹配单个字符a
,e
,n
,o
,s
,并且(可能令人惊讶,但是元字符特殊含义通常在[...
])|
内被忽略。