1xxx captures x
2xxx captures xx
3xxx captures xxx
我想也许这个简单的模式可行:
(\d)(.{\1})
但不。
我知道在Perl中这很容易,但我在Julia中使用PCRE,这意味着很难嵌入代码来动态更改表达式。
答案 0 :(得分:5)
请注意,正则表达式通常在执行之前被编译到状态机,并且不会被天真地解释。
从技术上讲,n Xn
(其中 n 是一个数字而 X 包含所有字符的规则)不是常规语言。它不是无上下文语言,甚至不是上下文相关语言! (见Chomsky Hierarchy)。虽然PCRE正则表达式可以匹配所有所有无上下文的语言(如果适当地表达),但引擎只能匹配非常有限的上下文敏感语言子集。我们手上有一个大问题,既不能用正则表达式解决,也不能用所有PCRE扩展的正则表达式解决。
这里的解决方案通常是在尝试解析某些输入时分离标记化,解析和语义验证。这里:
显然,在没有实现回溯或类似策略的情况下,这不会在这个特定情况下起作用,所以我们必须自己编写一个可以处理输入的解析器:
substr
的函数)。正则表达式很棒,但它们根本不是解决每个问题的正确工具。有时候,自己编写程序会更容易。
答案 1 :(得分:3)
一般情况下无法完成。对于您提供的特定示例,您可以使用以下内容:
1.{1}|2.{2}|3.{3}
如果你有一个很长但很固定的数字列表,你可以用编程方式生成模式。