我需要PCRE2正则表达式来查找";否";以及第一次和最后一次出现";是的";。
预期结果:
"no/yes" - expect two matches: "no" and "yes"
"no/yes/word/yes/no" - expect four matches: "no", "yes", "yes", "no"
"yes/yes/no/word/yes" - expect three matches: first "yes", "no", third "yes"
"yes/no/yes/yes" - expect three matches: first "yes", "no", third "yes"
我尝试了这个正则表达式,但它不能像预期的那样与";是/否/是/是";。
这个子任务可以让我对主要目标感到满意。
如果您可以使用PCRE2替换字符串条件,则可以实现您想要的结果。您可以使用此regex(为清晰起见,添加空白,使用x
标志或删除替换之间的换行符(:
(no)|
(yes)(?!.*yes)|
((?!(?=(?<a>[sS]*))(?<b>yes.*(?=k<a>z)|(?<=(?=x^|(?&b))[sS])))yes)
它匹配其中一个:
(no)
:no
(第1组捕获((yes)(?!.*yes)
:yes
后未接yes
(第2组捕获(((?!(?=(?<a>[sS]*))(?<b>yes.*(?=k<a>z)|(?<=(?=x^|(?&b))[sS])))yes)
:这相当于(?<!yes.*)(yes)
与第3组中捕获的yes
的可变长度负后备。有关正则表达式这一部分的派生,请参阅这篇博客文章
然后可以使用条件替换,将组1替换为-
,将组2和组3替换为+
${1:+-:+}
用于的输入
no/yes
no/yes/yes/no
/yes/yes/no/yes
no/word/no/yes/yes/yes/no
yes/no
yes/no/yes/word/yes
/word/yes/no/no/no/yes/yes
yes/no/yes/yes
这给出:
-/+
-/+/+/-
/+/yes/-/+
-/word/-/+/yes/+/-
+/-
+/-/yes/word/+
/word/+/-/-/-/yes/+
+/-/yes/+
regex101 演示
您想得太多了。
使用一个正则表达式来替换所有正则表达式没有实际意义
只需使用多个正则表达式。
s.replace(/yes/, '+').replace(/yes(?!.*yes)/, '+').replaceAll(/no/g, '-')
此外,没有真正的方法来替换一个条目exept来替换它