Regex 如何生成If-Then-Else正则表达式条件语句
我试图在正则表达式中生成If-Then-Else条件语句 正则表达式接受表示文件名的字符串作为输入 这是我的测试字符串Regex 如何生成If-Then-Else正则表达式条件语句,regex,Regex,我试图在正则表达式中生成If-Then-Else条件语句 正则表达式接受表示文件名的字符串作为输入 这是我的测试字符串 The Edge Of Seventeen 2016 720p.mp4 20180511 2314 - Film4 - Northern Soul.ts 20150526 2059 - BBC Four - We Need to Talk About Kevin.ts 在第一个字符串中,2016表示一年,但在其他两个字符串中,2314和2059表示24小时时钟格式的时间 如果
The Edge Of Seventeen 2016 720p.mp4
20180511 2314 - Film4 - Northern Soul.ts
20150526 2059 - BBC Four - We Need to Talk About Kevin.ts
在第一个字符串中,2016表示一年,但在其他两个字符串中,2314和2059表示24小时时钟格式的时间
如果文件名与此正则表达式匹配,则应保持不变:
\d{8} \d{4} -.*?- .*?\.ts
我已经测试过了,效果很好。它可以匹配以下测试字符串:
20180511 2314 - Film4 - Northern Soul.ts
20150526 2059 - BBC Four - We Need to Talk About Kevin.ts
如果文件名与第一个正则表达式不匹配,则应将此正则表达式应用于该文件:
(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?
这是一个cleandatetime regexp,Kodi使用它删除四位数字(如果存在)后字符串中的所有内容,该数字表示1900到2099之间的日期。我也测试过这个,它是有效的
下面是我尝试创建If-Then-Else正则表达式的内容,但它不起作用:
我使用这种格式-->(?(A)X | Y)
这是一个
\d{8} \d{4} -.*?- .*?\.ts
这是X
^.*$
这是我的
(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?
这是预期的输出
测试字符串:
2016年17月的边缘720p.mp4
预期输出:
“2016年17月的边缘”(引用仅表明末尾可以留有尾随空间)
测试字符串:
201805112314-电影4-Northern Soul.ts
预期输出:
201805112314-电影4-Northern Soul.ts
测试字符串:
201505262059-BBC四台-我们需要谈谈Kevin.ts
预期输出:
201505262059-BBC四台-我们需要谈谈Kevin.ts
我正在寻找一个完全使用正则表达式语法的解决方案。有人能帮我把它弄好吗
干杯
Flex您可以使用PCRE模式,如
^(?!\d{8} \d{4} -.*?- .*?\.ts$)(.*[^ _,.()\[\]-][ _.()\[\]-]+(?:19|20)[0-9]{2})(?:[ _,.()\[\]-]|[^0-9]$)?.*
替换为$1
,请参阅
相配
-字符串的开头^
-如果整个字符串匹配,则负先行查找将失败(?!\d{8}\d{4}-.?-.*.\.ts$)
-8位数字,空格,4位数字,空格\d{8}\d{4}
--.*.-.*.
,然后是除换行符以外的任何0个或更多字符,尽可能少,-
和一个空格,然后是除换行符以外的0个或更多字符,尽可能少-
-\.ts$
位于字符串末尾.ts
:可选组1,然后是字符串的其余部分:(.[^^,.()\[\]-][\.()\[\]-]+(?:19-20)[0-9]{2})(?:[^,.()\[\]-].[^0-9]$)?.
-尽可能多的0+字符(断线字符除外)*
-除[^,.()\[\]-]
-1+空格,[\[\]-]+
,
,
,(
,)
,[
或]
-
-(?:19 | 20)
或19
20
-两位数字[0-9]{2}
-与空格匹配的可选非捕获组,(?:[\u,.()\[\]-][^ 0-9]$)?
,
,
,(
,)
或]
或字符串末尾数字以外的任何字符-
*[^,.()\[\]-][\[\]+(?:19 | 20)[0-9]{2})(?:[^,.()\[\]-][^0-9]$
-尽可能多的0+字符,断线字符除外*
A
、X
和Y
都经过了测试,并且发现它们是有效的,而且因为只有两种模式,我认为这种模式会起作用(Python风格):
这意味着:
(.?(?=A)X)|(Y)
说明:
X
,另一组用于Y
X
的组从?
开始,只是为了使发动机开始移动,并检查前方是否有匹配X
的零件(向前看)。如果是,则继续匹配X
,因为它将在向前看块后遇到该零件|
(或)部分,即Y
将接管。如果匹配,则得到一个结果。否则,没有输出(遗憾的是,您发布的
A
和Y
的模式在Python上对我不起作用,所以我用自己的模式替换了它们进行测试。请确认该模式是否与原始模式起作用。)如果您使用PCRE,请尝试使用Magic!谢谢Wiktor。抱歉,这实际上更容易,我在深夜发布了评论:)谢谢你的帮助。但是我的问题现在已经改变了,我需要使用PCRE。请看你有没有时间?谢谢Wiktor。现在我的要求有了一点变化。。我分别发帖寻求帮助。这是对挑战的一个小修改,我认为需要(?(a)X | Y)方法。如果你能帮忙,我将不胜感激?
pattern = "(.?(?=" + A + ")" + X + ")|(" + Y + ")"
(.?(?=A)X)|(Y)