用于验证 "abc-b=ac" 等减法方程式的正则表达式
Regex to validate subtract equations like "abc-b=ac"
我偶然发现了一个正则表达式问题。
如何验证这样的减法方程?
一个字符串减去另一个字符串等于剩下的部分(所有项都是普通字符串,不是集合。所以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
这是我尝试过的方法,您可以尝试一下
免责声明:我看到一些评论被删除了。因此,让我首先说,尽管很短(就代码高尔夫而言),但就所涉及的步骤而言,以下答案不是最有效的。不过,从问题的性质及其“难题”方面来看,它可能会做得很好。为了获得更有效的答案,我想将您重定向到 答案。
这是我的尝试:
^(.*)(.+)(.*)-=(?=.)$
在线查看demo
^
- 起始行锚点。
(.*)
- 第一个包含 0+ 个非换行符的捕获组;
(.+)
- 第二个捕获组包含 1 个以上的非换行符;
(.*)
- 第 3 个捕获组具有 0+ 个非换行符,直到;
-=
- 连字符后跟对我们的第二个捕获组的反向引用和文字“=”。
(?=.)
- 断言位置的肯定前瞻后跟除换行符之外的至少一个字符。
</code> - 对第一个和第三个捕获组中捕获的内容的反向引用。</li>
<li><code>$
- 结束行锚点。
编辑:
我想限制性更强的可能是:
^([a-z]*)([a-z]+)((?1))-=(?=.)$
您可以使用这个更高效的正则表达式,在开始时先行使用捕获组匹配 -
右侧的文本,即 -
和 =
之间的子字符串并将其捕获到第 1 组中。然后在正则表达式的主体中,我们只检查捕获组 #1 的存在,并在 2 个单独的组中捕获 </code> 前后的文本。</p>
<pre><code>^(?=[^-]+-([^=]+)=.)([^-]*?)([^-]*)-[^=]+=$
正则表达式演示:
^
: 开始
(?=[^-]+-([^=]+)=.)
:先行确保我们有 pqr-pq=r
的表达式结构,还有 更重要的是 捕获 -
和 [= 之间的子字符串13=] 在捕获组 #1 中。 =
之后的 .
是否有理由禁止 =
之后的任何空字符串。
([^-]*?)
: 匹配捕获组 #2 中的 0 个或多个非 -
字符
</code>:向后引用组 #1 以确保我们匹配与捕获组 #1 中相同的值</li>
<li><code>([^-]*)
:匹配捕获组 #3 中的 0 个或多个非 -
字符
-
:匹配一个-
[^=]+
:匹配0个或多个非=
字符
=
:匹配一个=
</code>: 对组#2 和#3 的反向引用,这是减法的差异</li>
<li><code>$
:结束
我偶然发现了一个正则表达式问题。
如何验证这样的减法方程?
一个字符串减去另一个字符串等于剩下的部分(所有项都是普通字符串,不是集合。所以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
这是我尝试过的方法,您可以尝试一下
免责声明:我看到一些评论被删除了。因此,让我首先说,尽管很短(就代码高尔夫而言),但就所涉及的步骤而言,以下答案不是最有效的。不过,从问题的性质及其“难题”方面来看,它可能会做得很好。为了获得更有效的答案,我想将您重定向到
这是我的尝试:
^(.*)(.+)(.*)-=(?=.)$
在线查看demo
^
- 起始行锚点。(.*)
- 第一个包含 0+ 个非换行符的捕获组;(.+)
- 第二个捕获组包含 1 个以上的非换行符;(.*)
- 第 3 个捕获组具有 0+ 个非换行符,直到;-=
- 连字符后跟对我们的第二个捕获组的反向引用和文字“=”。(?=.)
- 断言位置的肯定前瞻后跟除换行符之外的至少一个字符。</code> - 对第一个和第三个捕获组中捕获的内容的反向引用。</li> <li><code>$
- 结束行锚点。
编辑:
我想限制性更强的可能是:
^([a-z]*)([a-z]+)((?1))-=(?=.)$
您可以使用这个更高效的正则表达式,在开始时先行使用捕获组匹配 -
右侧的文本,即 -
和 =
之间的子字符串并将其捕获到第 1 组中。然后在正则表达式的主体中,我们只检查捕获组 #1 的存在,并在 2 个单独的组中捕获 </code> 前后的文本。</p>
<pre><code>^(?=[^-]+-([^=]+)=.)([^-]*?)([^-]*)-[^=]+=$
正则表达式演示:
^
: 开始(?=[^-]+-([^=]+)=.)
:先行确保我们有pqr-pq=r
的表达式结构,还有 更重要的是 捕获-
和 [= 之间的子字符串13=] 在捕获组 #1 中。=
之后的.
是否有理由禁止=
之后的任何空字符串。([^-]*?)
: 匹配捕获组 #2 中的 0 个或多个非 </code>:向后引用组 #1 以确保我们匹配与捕获组 #1 中相同的值</li> <li><code>([^-]*)
:匹配捕获组 #3 中的 0 个或多个非 -
:匹配一个-
[^=]+
:匹配0个或多个非=
字符=
:匹配一个=
</code>: 对组#2 和#3 的反向引用,这是减法的差异</li> <li><code>$
:结束
-
字符
-
字符