如何做一个复杂的多个 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
不存在,它将继续到下一个选项,依此类推
(?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;))
我需要用五个优先选项做一个复杂的 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
不存在,它将继续到下一个选项,依此类推
(?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;))