【发布时间】:2016-02-17 06:54:55
【问题描述】:
我使用了很多正则表达式,但偶然发现了一个正则表达式实际上不能描述的问题。
我想到的第一个例子是匹配像XOOXXXOOOOXXXXX... 这样的字符串。这将是一个由 X 和 O 的交替序列组成的字符串,其中每个子部分仅包含字符 X 或 O 比另一个字符的先前序列长。
谁能解释正则表达式的正式限制是什么?我知道这可能是一个相当学术的问题,但我是一个好奇的人 ;-)
编辑 因为我是一个 php 人,所以我对 PCRE 标准描述的正则表达式特别感兴趣,如下所述:http://php.net/manual/en/reference.pcre.pattern.syntax.php 我知道 PCRE 允许很多不属于原始正则表达式的内容,例如反向引用。
平衡括号的数学运算似乎是一般正则表达式无法匹配的一个示例,但它可以使用 PCRE 进行匹配(请参阅http://sandbox.onlinephpfunctions.com/code/fd12b580bb9ad7a19e226219d5146322a41c6e47 的实时示例):
$data = array('()', '(())', ')(', '(((()', '(((((((((())))))))))', '()()');
$regex = '/^((?:[^()]|\((?1)\))*+)$/';
foreach($data as $d) {
echo "$d matched by regex: " . (preg_match($regex, $d) ? 'yes' : 'no') . "\n";
}
【问题讨论】:
-
您还应该定义您希望定义术语“正则表达式”的严格程度 - 现代正则表达式引擎具有使它们能够感知上下文并支持递归的功能; “真正的”正则表达式不能做的两件事。
-
你是对的。我会更新我的问题。
-
您一定对 PCRE 与其他正则表达式相比不能做什么感兴趣,或者只是对它不能做什么感兴趣?我看不出有什么实际意义:正则表达式是一种文本解析器,所以它不能递增数字,它不知道对象是否为空等等。你的意思是你想要一个 字符串模式列表 i> 不能与 PCRE 匹配? N 个退格后跟 N 个字符无法删除,但 N 个退格后跟 N 个相同字符是可以删除的。
-
寻找一个简单而全面的例子来说明 PCRE 无法匹配的内容。演示“正常”正则表达式无法匹配的“标准示例”似乎是平衡的括号系列,但可以通过 PCRE 匹配。只是寻找一个场景,我可以对尝试匹配但无法使用 PCRE 匹配的序列进行口头描述。例如,例如匹配所有素数的 PCRE 不会很令人满意,因为没有人可以真实描述这些字符串的外观。
-
学术上的答案是正则表达式不能匹配“不规则”语言,尽管在实践中有些可以(扩展正则表达式),实际上它们'经常用来做那个(用正则表达式“解析”HTML,不寒而栗)......
标签: php regex pcre computation-theory