答案 1
受到NullUserExceptions答案的启发(他已经删除了,因为它在一个案例中失败了),我想我自己已经找到了一个解决方案:
$regex = '~^
(?=(a(?-1)?b)c)
a+(b(?-1)?c)
$~x';
var_dump(preg_match($regex, 'aabbcc')); // 1
var_dump(preg_match($regex, 'aaabbbccc')); // 1
var_dump(preg_match($regex, 'aaabbbcc')); // 0
var_dump(preg_match($regex, 'aaaccc')); // 0
var_dump(preg_match($regex, 'aabcc')); // 0
var_dump(preg_match($regex, 'abbcc')); // 0
亲自尝试一下:http://codepad.viper-7.com/1erq9v
解释
如果您考虑没有正前瞻断言(该部分)的正则表达式,则有以下情况:(?=...)
~^a+(b(?-1)?c)$~
这只不过是检查是否存在任意数量的 s,后跟相等数量的 s 和 s。a
b
c
这还不能满足我们的语法,因为s的数量也必须相同。我们可以通过检查 s 的个数等于 s 的个数来确保这一点。这就是前瞻断言中的表达式的作用:.这是必要的,所以我们不只匹配s的一部分。a
a
b
(a(?-1)?b)c
c
b
结论
我认为这令人印象深刻地表明,现代正则表达式不仅能够解析非正则语法,甚至可以解析非上下文无关的语法。希望这将平息“你不能用正则表达式做X,因为X不是常规的”的无休止的鹦鹉学舌。
答案 2
下面是使用 .NET 正则表达式平衡组的替代解决方案:
^(?'a'a)+(?'b-a'b)+(?(a)(?!))(?'c-b'c)+(?(b)(?!))$
不是PCRE,但可能很有趣。
编辑:为组a添加了缺少的平衡检查,以及一个在线示例。
推荐
-
相当于Java中PHP的crypt函数 我正在将我的PHP代码迁移到Google App Engine - Java。因此,我需要一个相当于Java中PHP的crypt函数,因为我已将使用crypt的注册用户的所有密码存储在我的数据库中。 编辑1:这是我用于加密密码的php
-
需要有关如何从接受语言请求标头获取首选语言的示例 我需要一个代码示例或库来解析标头并返回我的首选语言。 指出: “接受语言请求标头”字段类似于“接受”,但限制首选作为请求响应的自然语言集。语言标记在第 3.10 节中定义。
-
无法在 Java 和 PHP 之间交换使用 AES-256 加密的数据 我的问题是:我在Java中加密的东西,我可以在Java中完全解密,但PHP不能解密。我用加密的内容可以使用 解密,但不能在 Java 中解密。 我想从Java应用程序发送和接收加密数据到PHP页面,所以我
-
-
Quercus是Java环境中PHP的可行替代品吗? 对于任何偶然发现这个问题的人,他们不知道是什么 - 它是用Java完成的PHP的实现。 对于我目前正在从事的项目,我们通过cgi在servlet上提供php页面(我知道它很笨拙,但这是支持遗留代码的要求
标签