Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何生成If-Then-Else正则表达式条件语句_Regex - Fatal编程技术网

Regex 如何生成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小时时钟格式的时间 如果

我试图在正则表达式中生成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小时时钟格式的时间

如果文件名与此正则表达式匹配,则应保持不变:

\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$)
    -如果整个字符串匹配,则负先行查找将失败
    • \d{8}\d{4}
      -8位数字,空格,4位数字,空格
    • -.*.-.*.
      -
      -
      ,然后是除换行符以外的任何0个或更多字符,尽可能少,
      -
      和一个空格,然后是除换行符以外的0个或更多字符,尽可能少
    • \.ts$
      -
      .ts
      位于字符串末尾
  • (.[^^,.()\[\]-][\.()\[\]-]+(?:19-20)[0-9]{2})(?:[^,.()\[\]-].[^0-9]$)?.
    :可选组1,然后是字符串的其余部分:
    • *
      -尽可能多的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
    ,因为它将在向前看块后遇到该零件
  • 如果在(2)中,前瞻不匹配,则
    |
    (或)部分,即
    Y
    将接管。如果匹配,则得到一个结果。否则,没有输出

  • (遗憾的是,您发布的
    A
    Y
    的模式在Python上对我不起作用,所以我用自己的模式替换了它们进行测试。请确认该模式是否与原始模式起作用。)

    如果您使用PCRE,请尝试使用Magic!谢谢Wiktor。抱歉,这实际上更容易,我在深夜发布了评论:)谢谢你的帮助。但是我的问题现在已经改变了,我需要使用PCRE。请看你有没有时间?谢谢Wiktor。现在我的要求有了一点变化。。我分别发帖寻求帮助。这是对挑战的一个小修改,我认为需要(?(a)X | Y)方法。如果你能帮忙,我将不胜感激?
    pattern = "(.?(?=" + A + ")" + X + ")|(" + Y + ")"
    
    (.?(?=A)X)|(Y)