1
1xxx      captures x
2xxx      captures xx
3xxx      captures xxx

我想也许这个简单的模式会起作用:

(\d)(.{\1})

但不是。

我知道这在 Perl 中很容易,但我在 Julia 中使用 PCRE,这意味着很难嵌入代码来动态更改表达式。

4

2 回答 2

5

请注意,正则表达式通常在执行之前被编译成状态机,并且不会被天真地解释。

从技术上讲,(其中n是一个数字,X是一个包含所有字符的规则)不是常规语言。它不是上下文无关语言,甚至不是 上下文相关语言!(参见乔姆斯基层次结构)。虽然 PCRE 正则表达式可以匹配所有所有上下文无关语言(如果表达得当),但引擎只能匹配非常有限的上下文相关语言子集。我们手头有一个大问题,既不能用正则表达式也不能用所有 PCRE 扩展的正则表达式来解决。n Xn

这里的解决方案通常是在尝试解析某些输入时将标记化、解析和语义验证分开。这里:

  1. 读取数字(可能使用正则表达式)
  2. 阅读以下字符(可能使用正则表达式)
  3. 验证字符串的长度是否等于给定的数字。

显然,如果不实施回溯或类似策略,这在这种特定情况下是行不通的,因此我们必须自己编写一个可以处理输入的解析器:

  1. 读取数字(可能使用正则表达式)
  2. 然后在该位置读取该数量的字符(可能使用substr-like 函数)。

正则表达式很棒,但它们根本不是解决所有问题的正确工具。有时,自己编写程序更容易。

于 2013-12-18T20:54:32.313 回答
3

一般是做不到的。对于您给出的特定示例,您可以使用以下内容:

1.{1}|2.{2}|3.{3}

如果您有一个很长但固定的数字列表,您可以通过编程方式生成模式。

于 2013-12-18T20:33:48.837 回答