在前瞻之后匹配不同的数字

时间:2014-08-02 20:42:36

标签: regex

说我有以下内容:

正则表达式:(?<=([sS][\d]{1,2}[eE]))(?(?=0)[1-9]{1}|[\d]{2}) 文字:FooBar.S02E03.foo

如何获得if的第一部分仅匹配&#39; 3&#39; E03?

我想要到达的是一个正则表达式,只匹配“E&#39;之后的第二个数字”。如果&#39; E&#39;之后的第一个数字为0,否则在&#39; E&#39;。

之后匹配两个数字

4 个答案:

答案 0 :(得分:2)

以下作品 - 您正在寻找什么?这将始终在第二个数字后停止匹配(如果没有必要,则不清楚为什么首先需要这么复杂的正则表达式。)

(?<=[sS]\d{1,2}[eE](0)?)(?(1)[1-9]|[1-9]\d)

<强>解释

(?<=             # Lookbehind:
 [sS]\d{1,2}[eE] # SddE
 (0)?            # Match a zero if present
)                # End of lookbehind
(?(1)            # If the zero matched...
 [1-9]           # match a single digit (1-9)
|                # If it didn't match...
 [1-9]\d         # match two digits (1-9 and another one)
)                # End of conditional

答案 1 :(得分:0)

您可以跳过if-checks的所有复杂性。只需在S或E之后吃任何前导零:

echo FooBar.S02E03.foo | sed -r 's/(.*)\.S0*([0-9]{1,2})E0*([0-9]{1,2})\.(.*)/title:\1, season:\2, episode:\3, postfix:\4/'

title:FooBar, season:2, episode:3, postfix:foo

答案 2 :(得分:0)

拿走你原来的东西,并加入它,你可以:

(?<=([sS]))([\d]{1,2}[eE])(?(?=0)[0][1-9]{1}|[\d]{2})

由于无法检查是否有1位或2位数字,因此我从后视镜中取出了\ d。然后对于第二部分,在if语句中我在[1-9]之前添加了零,以完成正则表达式

我用输入测试了这个:

  

S02E03   S02E14

http://regex101.com/上,它是一个非常方便的工具,用于在使用前检查正则表达式

答案 3 :(得分:0)

@Time Pietzcker的解决方案足够好,但如果没有Lookbehind支持量词的话,它对正则表达式引擎不起作用。下面提供了一个简单的正则表达式引擎的解决方案,它使用非捕获组和\ K来绕过限制。

(?<=[sS])(?:\d{1,2}[eE](0)?)\K(?(1)[1-9]|[1-9]\d)