说我有以下内容:
正则表达式:(?<=([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;。
之后匹配两个数字答案 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)