匹配第一个和最后一个"yes"以及所有"no"



我需要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来替换它

相关内容

  • 没有找到相关文章

最新更新