正则表达式验证减法方程,如“abc-b=ac”
我偶然发现了一个正则表达式问题。
如何验证这样的减法方程?
一个字符串减去另一个字符串等于剩下的任何东西(所有术语都只是普通字符串,而不是集合。所以ab和ba是不同的字符串)。
经过
abc-b=acabcde-cd=abeab-a=babcde-a=bcdeabcde-cde=ab
失败
abc-a=cabcde-bd=aceabc-cd=ababcde-a=cdeabc-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 ++++.