如何做一个复杂的多个 if-then-else 正则表达式?

How to do a complex multiple if-then-else regex?

我需要用五个优先选项做一个复杂的 if-then-else。假设我首先要匹配abc,如果不匹配则匹配a.c,然后如果不匹配def,则%#@,然后1z;

我可以嵌套 if-thens 吗?否则如何实现?我以前从未使用过 if-then。

例如,在字符串 1z;%#@defarcabcaqcdef%#@1z; 中我想要输出 abc.

在字符串 1z;%#@defarcabaqcdef%#@1z; 中我想要输出 arc.

在字符串 1z;%#@defacabacdef%#@1z; 中我想要输出 def.

在字符串 1z;#@deacabacdf%#@1z; 中我想要输出 %#@.

在字符串 foo;%@dfaabaef#@1z;barbbbaarr3 中我想要输出 1z;.

您需要强制每个选项单独匹配,而不是将它们放在一起。这样做: .*?(?:x|y|z) 将匹配任何选项匹配的第一个匹配项。对字符串使用该正则表达式,即 abczx 将 return z 因为这是它找到的第一个匹配项。要强制 优先化 ,您需要结合 .*? 的逻辑和每个选项,以便获得类似于 .*?x|.*?y|.*?z 的正则表达式。它将逐个尝试每个选项,直到找到匹配项。所以如果 x 不存在,它将继续到下一个选项,依此类推

See regex in use here

(?m)^(?:.*?(?=abc)|.*?(?=a.c)|.*?(?=def)|.*?(?=%#@)|.*?(?=1z;))(.{3})
  • (?m) 启用多行模式,以便 ^$ 匹配每一行的 start/end
  • (?:.*?(?=abc)|.*?(?=a.c)|.*?(?=def)|.*?(?=%#@)|.*?(?=1z;)) 匹配以下任一选项
    • .*?(?=abc) 匹配任何字符任意次数,但尽可能少,确保后面的内容是 abc 字面意思
    • .*?(?=a.c) 匹配任何字符任意次数,但尽可能少,确保后面是 a,任何字符,然后是 c
    • .*?(?=def) 匹配任何字符任意次数,但尽可能少,确保后面的是 def 字面意思
    • .*?(?=%#@) 匹配任何字符任意次数,但尽可能少,确保后面的内容是 %#@ 字面意思
    • .*?(?=1z;) 匹配任何字符任意次数,但尽可能少,确保后面的内容是 1z; 字面意思
  • (.{3}) 捕获任意字符 3 次进入捕获组 1

如果选项的长度不同,您必须在不同的组中捕获 as seen here:

(?m)^(?:.*?(abc)|.*?(a.c)|.*?(def)|.*?(%#@)|.*?(1z;))