首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何生成If然后If Regex条件语句

如何生成If然后If Regex条件语句
EN

Stack Overflow用户
提问于 2020-02-25 01:04:13
回答 2查看 1.2K关注 0票数 2

我试图在正则表达式中生成一个If-然后-否则条件语句。

regex接受一个表示文件名的字符串作为输入。

这是我的测试线..。

代码语言:javascript
复制
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小时时钟格式的时间。

如果文件名与此regex匹配,则文件名应保持不变:

代码语言:javascript
复制
\d{8} \d{4} -.*?- .*?\.ts

我已经测试过了,而且效果很好。它可以匹配以下测试字符串:

代码语言:javascript
复制
20180511 2314 - Film4 - Northern Soul.ts
20150526 2059 - BBC Four - We Need to Talk About Kevin.ts

如果文件名与第一个regex不匹配,则应将该regex应用于它:

代码语言:javascript
复制
(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?

这是一个清洁时间regexp,Kodi使用它来删除字符串中的所有内容,如果它存在四位数,则表示1900到2099年之间的日期。我也测试过这个,它很有效。

下面是我试图做的,如果-然后- Regex,但它不起作用:

我使用这种格式->((A)X\Y)

代码语言:javascript
复制
(?(\d{8} \d{4} -.*?- .*?\.ts)^.*$|(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?)

这是A

代码语言:javascript
复制
\d{8} \d{4} -.*?- .*?\.ts

这是X

代码语言:javascript
复制
^.*$

这是Y

代码语言:javascript
复制
(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?

这是预期的输出。

测试字符串:边缘十七年720p.mp4 预期输出:“十七零一六年的边缘”(引号仅用于显示尾端可以留出一个尾随空间)

测试字符串: 20180511 2314 - Film4 - Northern Soul.ts 预期输出: 20180511 2314 - Film4 - Northern Soul.ts

测试字符串: 20150526 2059 - BBC 4-我们需要讨论Kevin.ts 预期输出: 20150526 2059 - BBC 4-我们需要谈论Kevin.ts

我正在寻找一个完全用正则表达式语法的解决方案。有人能帮我把它修好吗?

干杯,

Flex

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-25 07:55:22

您可以使用PCRE模式,如

代码语言:javascript
复制
^(?!\d{8} \d{4} -.*?- .*?\.ts$)(.*[^ _,.()\[\]-][ _.()\[\]-]+(?:19|20)[0-9]{2})(?:[ _,.()\[\]-]|[^0-9]$)?.*

$1替换,请参阅regex演示

相配

  • ^ -字符串的开始
  • (?!\d{8} \d{4} -.*?- .*?\.ts$) -如果整个字符串与匹配,则负查找失败
    • \d{8} \d{4} -8位数,空格,4位数,空格
    • -.*?- .*? - -,则任何0或多个字符(除断行字符以外),尽可能少,-和一个空格,然后再一次使用0或多个字符(除换行字符之外),尽可能少。
    • 字符串末尾的\.ts$ - .ts

  • (.*[^ _,.()\[\]-][ _.()\[\]-]+(?:19|20)[0-9]{2})(?:[ _,.()\[\]-]|[^0-9]$)?.*:一个可选的组1,然后字符串的其余部分:
    • .* -除行中断字符以外的任何0+字符尽可能多
    • [^ _,.()\[\]-] -除
    • [ _.()\[\]-]+ - 1+空间,_.()[]-
    • (?:19|20) - 1920
    • [0-9]{2} -两位数
    • (?:[ _,.()\[\]-]|[^0-9]$)? -一个可选的非捕获组,用于匹配空格、_.()[]-或字符串末尾的数字以外的任何字符。
    • .*[^ _,.()\[\]-][ _.()\[\]-]+(?:19|20)[0-9]{2})(?:[ _,.()\[\]-]|[^0-9]$
    • .* -除行中断字符以外的任何0+字符尽可能多。

票数 1
EN

Stack Overflow用户

发布于 2020-02-25 09:25:48

由于您已经提到了AXY是经过测试和发现有效的,而且由于只有2种模式,所以我认为这个模式会工作(Python ):

代码语言:javascript
复制
pattern = "(.?(?=" + A + ")" + X + ")|(" + Y + ")"

这意味着:

代码语言:javascript
复制
(.?(?=A)X)|(Y)

解释:

  1. 有两组,一组用于X,另一组用于Y
  2. 捕获X的组以.?开头,目的是让引擎开始移动,并检查前面是否有与X匹配的部分(查找)。如果是,它将继续进行匹配的X,因为它将在展望块之后遇到它。
  3. 如果在(2)中,查找不匹配,那么| (或)部分,即Y将接管。如果匹配的话,你就会得到结果。否则,没有输出。

(遗憾的是,您发布的AY的模式在Python上并不适用,所以我用自己的模式进行测试。请确认该模式是否与原始模式一起工作。)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60386155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档