-1

我需要用五个优先选项做一个复杂的 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;

4

1 回答 1

1

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

请参阅此处使用的正则表达式

(?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

如果选项的长度不同,您必须在不同的组中捕获,如下所示

(?m)^(?:.*?(abc)|.*?(a.c)|.*?(def)|.*?(%#@)|.*?(1z;))
于 2018-02-22T19:45:15.877 回答