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

时间:2018-02-22 19:05:32

标签: regex keyboard-maestro

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

我可以嵌套if-thens或者它将如何实现?我之前从未使用过if-thens。

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

在字符串1z;%#@defarcabaqcdef%#@1z;中,我希望输出arc

在字符串1z;%#@defacabacdef%#@1z;中,我希望输出def

在字符串1z;#@deacabacdf%#@1z;中,我希望输出%#@

在字符串foo;%@dfaabaef#@1z;barbbbaarr3中,我希望输出1z;

1 个答案:

答案 0 :(得分:1)

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

See regex in use here

(?m)^(?:.*?(?=abc)|.*?(?=a.c)|.*?(?=def)|.*?(?=%#@)|.*?(?=1z;))(.{3})
  • (?m)启用多行模式,以便^$匹配每行的开头/结尾
  • (?:.*?(?=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;))