我遇到了一个正则表达式的问题。
如何验证这样一个“减法方程”?
一个字符串减去另一个字符串等于剩下的部分(所有项都只是普通字符串,不是集合。因此ab
和ba
是不同的字符串)。
通过
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
以下是我尝试过的正则表达式,你可以尝试修改它
我遇到了一个正则表达式的问题。
如何验证这样一个“减法方程”?
一个字符串减去另一个字符串等于剩下的部分(所有项都只是普通字符串,不是集合。因此ab
和ba
是不同的字符串)。
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
以下是我尝试过的正则表达式,你可以尝试修改它
免责声明:我看到一些评论被删除了。所以让我先说一下,尽管以下答案在代码高尔夫方面很短,但是在涉及的步骤方面并不是最有效率的。不过,考虑到问题的性质和“难题”的方面,它可能表现得还不错。对于一个更有效率的答案,我想将您重定向到此答案。
这是我的尝试:
^(.*)(.+)(.*)-\2=(?=.)\1\3$
查看在线演示
^
- 行首锚点。(.*)
- 第一组捕获,从 0 个非换行符字符一直到;(.+)
- 第二组捕获,从 1 个非换行符字符一直到;(.*)
- 第三组捕获,从 0 个非换行符字符一直到;-\2=
- 连字符后面跟着对第二组捕获的反向引用和字面上的“=”。(?=.)
- 正前瞻断言位置后至少有一个除换行符外的字符。\1\3
- 对第一组和第三组捕获内容的反向引用。$
- 行尾锚点。编辑:
我想更加严格可能会是:
^([a-z]*)([a-z]+)((?1))-\2=(?=.)\1\3$
-
右侧的文本,即在-
和=
之间的子字符串,并将其捕获在第1组中,以实现更有效率的匹配。然后在正则表达式的主体部分,我们只需检查捕获组#1是否存在,并将文本分别捕获到两个单独的组中,在\1
之前和之后。^(?=[^-]+-([^=]+)=.)([^-]*?)\1([^-]*)-[^=]+=\2\3$
正则表达式示例:
^
: 开始(?=[^-]+-([^=]+)=.)
: 前瞻以确保我们有表达式结构pqr-pq=r
,更重要的是,在捕获组#1中捕获-
和=
之间的子字符串。在=
后面加上.
是出于一个原因,以防止在=
后面出现任何空字符串。([^-]*?)
: 在捕获组#2中匹配0个或多个非-
字符\1
: 回溯到组#1,以确保我们匹配与捕获组#1中相同的值([^-]*)
: 在捕获组#3中匹配0个或多个非-
字符-
: 匹配一个-
[^=]+
: 匹配0个或多个非=
字符=
: 匹配一个=
\2\3
: 回溯到组#2和#3,它们是相减的差异$
: 结尾[^-]
这样的限制对于验证可能并不是必要的吗?因为如果 .
失败,[^-]
也会失败...或者这只是为了更好的性能? - Hao Wu[^-]*
的性能比 .*
要快得多。 - anubhava(?=...)
是 Perl 的特色。此外,从数学/ Kleene 视角来看,那不是一个正则表达式。虽然在这里并不重要 :P - Antti Haapala -- Слава Україні
abc-(def-ghi)
和abc-(de-(fg-hi-(ij-kl)))
,此时正则表达式已经无法胜任这个任务了。你需要一个解析器。 - tripleeeabcde
不包含字符串bd
b) 是的,术语不能被打乱顺序 c) 不,只有三个术语被减数-减数=差
,每个术语都不能为空 - Hao Wu