正则表达式验证减法方程,如“abc-b=ac”

我偶然发现了一个正则表达式问题。

如何验证这样的减法方程

一个字符串减去另一个字符串等于剩下的任何东西(所有术语都只是普通字符串,而不是集合。所以abba是不同的字符串)。

经过

  • abc-b=ac
  • abcde-cd=abe
  • ab-a=b
  • abcde-a=bcde
  • abcde-cde=ab

失败

  • abc-a=c
  • abcde-bd=ace
  • abc-cd=ab
  • abcde-a=cde
  • abc-abc=
  • abc-=abc

这是我尝试过的,你可以试试

https://regex101.com/r/lTWUCY/1/

回答

免责声明:我看到一些评论已被删除。所以让我首先说,虽然很短(就代码高尔夫而言),但以下答案在所涉及的步骤方面并不是最有效的。不过,从问题的性质及其“谜题”方面来看,它可能会做得很好。为了获得更有效的答案,我想将您重定向到这个答案。


这是我的尝试:

^(.*)(.+)(.*)-2=(?=.)13$

看在线演示

  • ^ - 起点线锚。
  • (.*) - 第一个捕获组,最多包含 0 个以上的非换行符;
  • (.+) - 最多包含 1 个以上非换行符的第二个捕获组;
  • (.*) - 最多有 0 个非换行符的第三个捕获组;
  • -2= - 连字符后跟对我们的第二个捕获组的反向引用和文字“=”。
  • (?=.) - 断言位置的正向前瞻后跟至少一个除换行符以外的字符。
  • 13 - 对第一个和第三个捕获组中捕获的内容的反向引用。
  • $ - 结束线锚。

编辑:

我想更严格的可能是:

^([a-z]*)([a-z]+)((?1))-2=(?=.)13$


回答

您可以使用这个更有效的正则表达式,并在开始时使用捕获组进行前瞻,该组匹配-ie 之间的子字符串右侧的文本-=并在组 #1 中捕获它。然后在正则表达式的主体中,我们只检查捕获组 #1 的存在,并1在 2 个单独的组中捕获前后文本。

^(?=[^-]+-([^=]+)=.)([^-]*?)1([^-]*)-[^=]+=23$

正则表达式演示

正则表达式演示:

  • ^: 开始
  • (?=[^-]+-([^=]+)=.):前瞻,以确保我们的表达结构pqr-pq=r,也更重要的是捕捉之间串-=在捕获组#1。.after=是不是有理由在 之后禁止任何空字符串=
  • ([^-]*?): 匹配-捕获组 #2 中的0 个或多个非字符
  • 1:反向引用组 #1 以确保我们匹配与捕获组 #1 中相同的值
  • ([^-]*): 匹配0个或多个-捕获组#3中的非字符
  • -: 匹配一个 -
  • [^=]+: 匹配 0 个或多个非=字符
  • =: 匹配一个 =
  • 23:反向引用组 #2 和 #3,这是减法的差异
  • $: 结尾
  • Indeed `[^-]*` performs much faster than `.*`
  • btw there is nothing PCRE in this, this will work same in Java, Python, Javascript etc as well
  • Your solutions keep on amazing me, I did not think of / see this before but that is really clever ++++.

以上是正则表达式验证减法方程,如“abc-b=ac”的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>