【发布时间】:2011-04-07 08:39:41
【问题描述】:
正则表达式教育系列文章的一部分,这是对嵌套引用概念的温和介绍。
前几个triangular numbers是:
1 = 1
3 = 1 + 2
6 = 1 + 2 + 3
10 = 1 + 2 + 3 + 4
15 = 1 + 2 + 3 + 4 + 5
有很多方法可以检查数字是否为三角形。有一种使用正则表达式的有趣技术如下:
- 给定n,我们首先创建一个长度为n且填充相同字符的字符串
- 然后我们将此字符串与模式
^(\1.|^.)+$进行匹配- n 是三角形的当且仅当此模式匹配字符串
这里有一些 sn-ps 表明它适用于多种语言:
PHP (on ideone.com)
$r = '/^(\1.|^.)+$/';
foreach (range(0,50) as $n) {
if (preg_match($r, str_repeat('o', $n))) {
print("$n ");
}
}
Java (on ideone.com)
for (int n = 0; n <= 50; n++) {
String s = new String(new char[n]);
if (s.matches("(\\1.|^.)+")) {
System.out.print(n + " ");
}
}
C# (on ideone.com)
Regex r = new Regex(@"^(\1.|^.)+$");
for (int n = 0; n <= 50; n++) {
if (r.IsMatch("".PadLeft(n))) {
Console.Write("{0} ", n);
}
}
所以这个正则表达式似乎可以工作,但有人可以解释一下吗?
类似问题
【问题讨论】:
-
这个系列是在社区的一些人(meta.stackexchange.com/questions/62695/…)的许可下开始的。如果接收良好,我计划继续介绍正则表达式的其他更高级和更基本的功能。
-
如果这应该是为了教育和社区,为什么不是社区维基?
-
我认为这种努力值得一些声誉。请不要强迫他们进入社区维基。谁在乎 poly 从 44k 到 50k,有什么区别?
-
我期待这个系列。请注意,如果您有兴趣简要探索正则表达式的起源,我开始为此撰写博客系列。不幸的是,我从未完成它。 blogs.msdn.com/b/ericlippert/archive/tags/regular+expressions
-
如果这是一个系列 - 发明一个标签怎么样,这将简化查找该系列的所有“文章”!?
标签: c# java regex capturing-group nested-reference