我需要做一个复杂的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;
。
答案 0 :(得分: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 如果选项的长度不同,您必须在不同的群组as seen here中捕获:
(?m)^(?:.*?(abc)|.*?(a.c)|.*?(def)|.*?(%#@)|.*?(1z;))