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

Hao*_* Wu 17 regex pcre

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

如何验证这样的减法方程

一个字符串减去另一个字符串等于剩下的任何东西(所有术语都只是普通字符串,而不是集合。所以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/

Jvd*_*vdV 17

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


这是我的尝试:

^(.*)(.+)(.*)-\2=(?=.)\1\3$
Run Code Online (Sandbox Code Playgroud)

看在线演示

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

编辑:

我想更严格的可能是:

^([a-z]*)([a-z]+)((?1))-\2=(?=.)\1\3$
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 13

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

^(?=[^-]+-([^=]+)=.)([^-]*?)\1([^-]*)-[^=]+=\2\3$
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

正则表达式演示:

  • ^: 开始
  • (?=[^-]+-([^=]+)=.):前瞻,以确保我们的表达结构pqr-pq=r,也更重要的是捕捉之间串-=在捕获组#1。.after=是不是有理由在 之后禁止任何空字符串=
  • ([^-]*?): 匹配-捕获组 #2 中的0 个或多个非字符
  • \1:反向引用组 #1 以确保我们匹配与捕获组 #1 中相同的值
  • ([^-]*): 匹配0个或多个-捕获组#3中的非字符
  • -: 匹配一个 -
  • [^=]+: 匹配 0 个或多个非=字符
  • =: 匹配一个 =
  • \2\3:反向引用组 #2 和 #3,这是减法的差异
  • $: 结尾

  • 事实上 `[^-]*` 的执行速度比 `.*` 快得多 (2认同)
  • 顺便说一句,这里面没有 PCRE,这在 Java、Python、Javascript 等中也同样有效 (2认同)
  • 你的解决方案一直让我惊叹不已,我之前没有想到/看到过这个,但这真的很聪明++++。 (2认同)