深入浅出之正则表达式(二)

前言:
  本文是前一片文章《深入浅出之正则表达式(一)》的续篇,在本文中讲述了正则表达式中的组与向后引用,先前向后查看,条件测试,单词边界,选择符等表达式及例子,并分析了正则引擎在执行匹配时的内部机理。
  本文是Jan Goyvaerts为RegexBuddy写的教程的译文,版权归原作者所有,欢迎转载。但是为了尊重原作者和译者的劳动,请注明出处!谢谢!

9.单词边界

元字符<<>>也是一种对位置进行匹配的“锚”。这种匹配是0长度匹配。

有4种位置被认为是“单词边界”:

1)在字符串的第一个字符前的位置(如果字符串的第一个字符是一个“单词字符”)
2)在字符串的最后一个字符后的位置(如果字符串的最后一个字符是一个“单词字符”)
3)在一个“单词字符”和“非单词字符”之间,其中“非单词字符”紧跟在“单词字符”之后
4)在一个“非单词字符”和“单词字符”之间,其中“单词字符”紧跟在“非单词字符”后面

“单词字符”是可以用“w”匹配的字符,“非单词字符”是可以用“W”匹配的字符。在大多数的正则表达式实现中,“单词字符”通常包括<<[a-zA-Z0-9_]>>。

例如:<<4>>能够匹配单个的4而不是一个更大数的一部分。这个正则表达式不会匹配“44”中的4。

换种说法,几乎可以说<<>>匹配一个“字母数字序列”的开始和结束的位置。

“单词边界”的取反集为<>,他要匹配的位置是两个“单词字符”之间或者两个“非单词字符”之间的位置。

·深入正则表达式引擎内部

让我们看看把正则表达式<<is>>应用到字符串“This island is beautiful”。引擎先处理符号<<>>。因为是0长度 ,所以第一个字符T前面的位置会被考察。因为T是一个“单词字符”,而它前面的字符是一个空字符(void),所以匹配了单词边界。接着<>和第一个字符“T”匹配失败。匹配过程继续进行,直到第五个空格符,和第四个字符“s”之间又匹配了<<>>。然而空格符和<>不匹配。继续向后,到了第六个字符“i”,和第五个空格字符之间匹配了<<>>,然后<>和第六、第七个字符都匹配了。然而第八个字符和第二个“单词边界”不匹配,所以匹配又失败了。到了第13个字符i,因为和前面一个空格符形成“单词边界”,同时<>和“is”匹配。引擎接着尝试匹配第二个<<>>。因为第15个空格符和“s”形成单词边界,所以匹配成功。引擎“急着”返回成功匹配的结果。

10.选择符

正则表达式中“|”表示选择。你可以用选择符匹配多个可能的正则表达式中的一个。

如果你想搜索文字“cat”或“dog”,你可以用<>。如果你想有更多的选择,你只要扩展列表<>。

选择符在正则表达式中具有最低的优先级,也就是说,它告诉引擎要么匹配选择符左边的所有表达式,要么匹配右边的所有表达式。你也可以用圆括号来限制选择符的作用范围。如<<(cat|dog)>>,这样告诉正则引擎把(cat|dog)当成一个正则表达式单位来处理。

·注意正则引擎的“急于表功”性

正则引擎是急切的,当它找到一个有效的匹配时,它会停止搜索。因此在一定条件下,选择符两边的表达式的顺序对结果会有影响。假设你想用正则表达式搜索一个编程语言的函数列表:Get,GetValue,Set或SetValue。一个明显的解决方案是<>。让我们看看当搜索SetValue时的结果。

因为<>和<>都失败了,而<>匹配成功。因为正则导向的引擎都是“急切”的,所以它会返回第一个成功的匹配,就是“Set”,而不去继续搜索是否有其他更好的匹配。

和我们期望的相反,正则表达式并没有匹配整个字符串。有几种可能的解决办法。一是考虑到正则引擎的“急切”性,改变选项的顺序,例如我们使用<>,这样我们就可以优先搜索最长的匹配。我们也可以把四个选项结合起来成两个选项:<>。因为问号重复符是贪婪的,所以SetValue总会在Set之前被匹配。

一个更好的方案是使用单词边界:<<(Get|GetValue|Set|SetValue)>>或<<(Get(Value)?|Set(Value)?>>。更进一步,既然所有的选择都有相同的结尾,我们可以把正则表达式优化为<<(Get|Set)(Value)?>>。

11.组与向后引用

把正则表达式的一部分放在圆括号内,你可以将它们形成组。然后你可以对整个组使用一些正则操作,例如重复操作符。

要注意的是,只有圆括号“()”才能用于形成组。“[]”用于定义字符集。“{}”用于定义重复操作。

当用“()”定义了一个正则表达式组后,正则引擎则会把被匹配的组按照顺序编号,存入缓存。当对被匹配的组进行向后引用的时候,可以用“数字”的方式进行引用。<<1>>引用第一个匹配的后向引用组,<<2>>引用第二个组,以此类推,<< >>引用第n个组。而<<>>则引用整个被匹配的正则表达式本身。我们看一个例子。

假设你想匹配一个HTML标签的开始标签和结束标签,以及标签中间的文本。比如This is a test,我们要匹配以及中间的文字。我们可以用如下正则表达式:“<([A-Z][A-Z0-9]*)[^>]*>.*?

首先,“<”将会匹配“”的第一个字符“<”。然后[A-Z]匹配B,[A-Z0-9]*将会匹配0到多次字母数字,后面紧接着0到多个非“>”的字符。最后正则表达式的“>”将会匹配“”的“>”。接下来正则引擎将对结束标签之前的字符进行惰性匹配,直到遇到一个“

你可以对相同的后向引用组进行多次引用,<<([a-c])x1x1>>将匹配“axaxa”、“bxbxb”以及“cxcxc”。如果用数字形式引用的组没有有效的匹配,则引用到的内容简单的为空。

一个后向引用不能用于它自身。<<([abc]1)>>是错误的。因此你不能将<<>>用于一个正则表达式匹配本身,它只能用于替换操作中。

后向引用不能用于字符集内部。<<(a)[1b]>>中的<<1>>并不表示后向引用。在字符集内部,<<1>>可以被解释为八进制形式的转码。

向后引用会降低引擎的速度,因为它需要存储匹配的组。如果你不需要向后引用,你可以告诉引擎对某个组不存储。例如:<>。其中“(”后面紧跟的“?:”会告诉引擎对于组(Value),不存储匹配的值以供后向引用。

·重复操作与后向引用

当对组使用重复操作符时,缓存里后向引用内容会被不断刷新,只保留最后匹配的内容。例如:<<([abc]+)=1>>将匹配“cab=cab”,但是<<([abc])+=1>>却不会。因为([abc])第一次匹配“c”时,“1”代表“c”;然后([abc])会继续匹配“a”和“b”。最后“1”代表“b”,所以它会匹配“cab=b”。

应用:检查重复单词–当编辑文字时,很容易就会输入重复单词,例如“the the”。使用<<(w+)s+1>>可以检测到这些重复单词。要删除第二个单词,只要简单的利用替换功能替换掉“1”就可以了。

·组的命名和引用

在PHP,Python中,可以用<<(?Pgroup)>>来对组进行命名。在本例中,词法?P就是对组(group)进行了命名。其中name是你对组的起的名字。你可以用(?P=name)进行引用。

.NET的命名组

.NET framework也支持命名组。不幸的是,微软的程序员们决定发明他们自己的语法,而不是沿用Perl、Python的规则。目前为止,还没有任何其他的正则表达式实现支持微软发明的语法。

下面是.NET中的例子:

(?group)(?’second’group)

正如你所看到的,.NET提供两种词法来创建命名组:一是用尖括号“<>”,或者用单引号“’’”。尖括号在字符串中使用更方便,单引号在ASP代码中更有用,因为ASP代码中“<>”被用作HTML标签。

要引用一个命名组,使用k或k’name’.

当进行搜索替换时,你可以用“${name}”来引用一个命名组。

12.正则表达式的匹配模式

本教程所讨论的正则表达式引擎都支持三种匹配模式:

<>使正则表达式对大小写不敏感,

<>开启“单行模式”,即点号“.”匹配新行符

<>开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置。

·在正则表达式内部打开或关闭模式

如果你在正则表达式内部插入修饰符(?ism),则该修饰符只对其右边的正则表达式起作用。(?-i)是关闭大小写不敏感。你可以很快的进行测试。<<(?i)te(?-i)st>>应该匹配TEst,但是不能匹配teST或TEST.

13.原子组与防止回溯

在一些特殊情况下,因为回溯会使得引擎的效率极其低下。

让我们看一个例子:要匹配这样的字串,字串中的每个字段间用逗号做分隔符,第12个字段由P开头。

我们容易想到这样的正则表达式<<^(.*?,)___noise___ 1078P>>。这个正则表达式在正常情况下工作的很好。但是在极端情况下,如果第12个字段不是由P开头,则会发生灾难性的回溯。如要搜索的字串为“1,2,3,4,5,6,7,8,9,10,11,12,13”。首先,正则表达式一直成功匹配直到第12个字符。这时,前面的正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11,”,到了下一个字符,<

>并不匹配“12”。所以引擎进行回溯,这时正则表达式消耗的字串为“1,2,3,4,5,6,7,8,9,10,11”。继续下一次匹配过程,下一个正则符号为点号<<.>>,可以匹配下一个逗号“,”。然而<<,>>并不匹配字符“12”中的“1”。匹配失败,继续回溯。大家可以想象,这样的回溯组合是个非常大的数量。因此可能会造成引擎崩溃。

用于阻止这样巨大的回溯有几种方案:

一种简单的方案是尽可能的使匹配精确。用取反字符集代替点号。例如我们用如下正则表达式<<^([^, ]*,){11}P>>,这样可以使失败回溯的次数下降到11次。

另一种方案是使用原子组。

原子组的目的是使正则引擎失败的更快一点。因此可以有效的阻止海量回溯。原子组的语法是<<(?>正则表达式)>>。位于(?>)之间的所有正则表达式都会被认为是一个单一的正则符号。一旦匹配失败,引擎将会回溯到原子组前面的正则表达式部分。前面的例子用原子组可以表达成<<^(?>(.*?,){11})P>>。一旦第十二个字段匹配失败,引擎回溯到原子组前面的<<^>>。

14.向前查看与向后查看

Perl 5 引入了两个强大的正则语法:“向前查看”和“向后查看”。他们也被称作“零长度断言”。他们和锚定一样都是零长度的(所谓零长度即指该正则表达式不消耗被匹配的字符串)。不同之处在于“前后查看”会实际匹配字符,只是他们会抛弃匹配只返回匹配结果:匹配或不匹配。这就是为什么他们被称作“断言”。他们并不实际消耗字符串中的字符,而只是断言一个匹配是否可能。

几乎本文讨论的所有正则表达式的实现都支持“向前向后查看”。唯一的一个例外是Javascript只支持向前查看。

·肯定和否定式的向前查看

如我们前面提过的一个例子:要查找一个q,后面没有紧跟一个u。也就是说,要么q后面没有字符,要么后面的字符不是u。采用否定式向前查看后的一个解决方案为<>。否定式向前查看的语法是<<(?!查看的内容)>>。

肯定式向前查看和否定式向前查看很类似:<<(?=查看的内容)>>。

如果在“查看的内容”部分有组,也会产生一个向后引用。但是向前查看本身并不会产生向后引用,也不会被计入向后引用的编号中。这是因为向前查看本身是会被抛弃掉的,只保留匹配与否的判断结果。如果你想保留匹配的结果作为向后引用,你可以用<<(?=(regex))>>来产生一个向后引用。

·肯定和否定式的先后查看

向后查看和向前查看有相同的效果,只是方向相反
否定式向后查看的语法是:<<(?>
肯定式向后查看的语法是:<<(?<=查看内容)>>
我们可以看到,和向前查看相比,多了一个表示方向的左尖括号。

例:<<(?>将会匹配一个没有“a”作前导字符的“b”。

值得注意的是:向前查看从当前字符串位置开始对“查看”正则表达式进行匹配;向后查看则从当前字符串位置开始先后回溯一个字符,然后再开始对“查看”正则表达式进行匹配。

·深入正则表达式引擎内部

让我们看一个简单例子。

把正则表达式<>应用到字符串“Iraq”。正则表达式的第一个符号是<>。正如我们知道的,引擎在匹配<>以前会扫过整个字符串。当第四个字符“q”被匹配后,“q”后面是空字符(void)。而下一个正则符号是向前查看。引擎注意到已经进入了一个向前查看正则表达式部分。下一个正则符号是<>,和空字符不匹配,从而导致向前查看里的正则表达式匹配失败。因为是一个否定式的向前查看,意味着整个向前查看结果是成功的。于是匹配结果“q”被返回了。

我们在把相同的正则表达式应用到“quit”。<>匹配了“q”。下一个正则符号是向前查看部分的<>,它匹配了字符串中的第二个字符“i”。引擎继续走到下个字符“i”。然而引擎这时注意到向前查看部分已经处理完了,并且向前查看已经成功。于是引擎抛弃被匹配的字符串部分,这将导致引擎回退到字符“u”。

因为向前查看是否定式的,意味着查看部分的成功匹配导致了整个向前查看的失败,因此引擎不得不进行回溯。最后因为再没有其他的“q”和<>匹配,所以整个匹配失败了。

为了确保你能清楚地理解向前查看的实现,让我们把<>应用到“quit”。<>首先匹配“q”。然后向前查看成功匹配“u”,匹配的部分被抛弃,只返回可以匹配的判断结果。引擎从字符“i”回退到“u”。由于向前查看成功了,引擎继续处理下一个正则符号<>。结果发现<>和“u”不匹配。因此匹配失败了。由于后面没有其他的“q”,整个正则表达式的匹配失败了。

·更进一步理解正则表达式引擎内部机制

让我们把<<(?<=a)b>>应用到“thingamabob”。引擎开始处理向后查看部分的正则符号和字符串中的第一个字符。在这个例子中,向后查看告诉正则表达式引擎回退一个字符,然后查看是否有一个“a”被匹配。因为在“t”前面没有字符,所以引擎不能回退。因此向后查看失败了。引擎继续走到下一个字符“h”。再一次,引擎暂时回退一个字符并检查是否有个“a”被匹配。结果发现了一个“t”。向后查看又失败了。

向后查看继续失败,直到正则表达式到达了字符串中的“m”,于是肯定式的向后查看被匹配了。因为它是零长度的,字符串的当前位置仍然是“m”。下一个正则符号是<>,和“m”匹配失败。下一个字符是字符串中的第二个“a”。引擎向后暂时

深入浅出之正则表达式(一)

  正则表达式是个很好的东西。做为一个程序员,掌握正则表达式是很有必要的。经人介绍,发现这个文章写得还是不错的,就转摘了过来。
  感谢翻译者的劳动和分享。下面是正文:

前言:
半年前我对正则表达式产生了兴趣,在网上查找过不少资料,看过不少的教程,最后在使用一个正则表达式工具RegexBuddy时发现他的教程写的非常好,可以说是我目前见过最好的正则表达式教程。于是一直想把他翻译过来。这个愿望直到这个五一长假才得以实现,结果就有了这篇文章。关于本文的名字,使用“深入浅出”似乎已经太俗。但是通读原文以后,觉得只有用“深入浅出”才能准确的表达出该教程给我的感受,所以也就不能免俗了。
本文是Jan Goyvaerts为RegexBuddy写的教程的译文,版权归原作者所有,欢迎转载。但是为了尊重原作者和译者的劳动,请注明出处!谢谢!

1.什么是正则表达式

基本说来,正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。本文将用<>来表示一段具体的正则表达式。

一段文本就是最基本的模式,简单的匹配相同的文本。

2.不同的正则表达式引擎

正则表达式引擎是一种可以处理正则表达式的软件。通常,引擎是更大的应用程序的一部分。在软件世界,不同的正则表达式并不互相兼容。本教程会集中讨论Perl 5 类型的引擎,因为这种引擎是应用最广泛的引擎。同时我们也会提到一些和其他引擎的区别。许多近代的引擎都很类似,但不完全一样。例如.NET正则库,JDK正则包。

3.文字符号

最基本的正则表达式由单个文字符号组成。如<>,它将匹配字符串中第一次出现的字符“a”。如对字符串“Jack is a boy”。“J”后的“a”将被匹配。而第二个“a”将不会被匹配。

正则表达式也可以匹配第二个“a”,这必须是你告诉正则表达式引擎从第一次匹配的地方开始搜索。在文本编辑器中,你可以使用“查找下一个”。在编程语言中,会有一个函数可以使你从前一次匹配的位置开始继续向后搜索。

类似的,<>会匹配“About cats and dogs”中的“cat”。这等于是告诉正则表达式引擎,找到一个<>,紧跟一个<>,再跟一个<>。

要注意,正则表达式引擎缺省是大小写敏感的。除非你告诉引擎忽略大小写,否则<>不会匹配“Cat”。

·特殊字符

对于文字字符,有11个字符被保留作特殊用途。他们是:

[ ] ^ $ . | ? * + ( )

这些特殊字符也被称作元字符。

如果你想在正则表达式中将这些字符用作文本字符,你需要用反斜杠“”对其进行换码 (escape)。例如你想匹配“1+1=2”,正确的表达式为<<1+1=2>>.

需要注意的是,<<1+1=2>>也是有效的正则表达式。但它不会匹配“1+1=2”,而会匹配“123+111=234”中的“111=2”。因为“+”在这里表示特殊含义(重复1次到多次)。

在编程语言中,要注意,一些特殊的字符会先被编译器处理,然后再传递给正则引擎。因此正则表达式<<1+2=2>>在C++中要写成“1\+1=2”。为了匹配“C: emp”,你要用正则表达式<>。而在C++中,正则表达式则变成了“C:\\temp”。

·不可显示字符

可以使用特殊字符序列来代表某些不可显示字符:

<< >>代表Tab(0x09)
<< >>代表回车符(0x0D)
<< >>代表换行符(0x0A)

要注意的是Windows中文本文件使用“
”来结束一行而Unix使用“
”。

4.正则表达式引擎的内部工作机制

知道正则表达式引擎是如何工作的有助于你很快理解为何某个正则表达式不像你期望的那样工作。

有两种类型的引擎:文本导向(text-directed)的引擎和正则导向(regex-directed)的引擎。Jeffrey Friedl把他们称作DFA和NFA引擎。本文谈到的是正则导向的引擎。这是因为一些非常有用的特性,如“惰性”量词(lazy quantifiers)和反向引用(backreferences),只能在正则导向的引擎中实现。所以毫不意外这种引擎是目前最流行的引擎。

你可以轻易分辨出所使用的引擎是文本导向还是正则导向。如果反向引用或“惰性”量词被实现,则可以肯定你使用的引擎是正则导向的。你可以作如下测试:将正则表达式<>应用到字符串“regex not”。如果匹配的结果是regex,则引擎是正则导向的。如果结果是regex not,则是文本导向的。因为正则导向的引擎是“猴急”的,它会很急切的进行表功,报告它找到的第一个匹配 。

·正则导向的引擎总是返回最左边的匹配

这是需要你理解的很重要的一点:即使以后有可能发现一个“更好”的匹配,正则导向的引擎也总是返回最左边的匹配。

当把<>应用到“He captured a catfish for his cat”,引擎先比较<>和“H”,结果失败了。于是引擎再比较<>和“e”,也失败了。直到第四个字符,<>匹配了“c”。<>匹配了第五个字符。到第六个字符<>没能匹配“p”,也失败了。引擎再继续从第五个字符重新检查匹配性。直到第十五个字符开始,<>匹配上了“catfish”中的“cat”,正则表达式引擎急切的返回第一个匹配的结果,而不会再继续查找是否有其他更好的匹配。

5.字符集

字符集是由一对方括号“[]”括起来的字符集合。使用字符集,你可以告诉正则表达式引擎仅仅匹配多个字符中的一个。如果你想匹配一个“a”或一个“e”,使用<<[ae]>>。你可以使用<>匹配gray或grey。这在你不确定你要搜索的字符是采用美国英语还是英国英语时特别有用。相反,<>将不会匹配graay或graey。字符集中的字符顺序并没有什么关系,结果都是相同的。

你可以使用连字符“-”定义一个字符范围作为字符集。<<[0-9]>>匹配0到9之间的单个数字。你可以使用不止一个范围。<<[0-9a-fA-F] >>匹配单个的十六进制数字,并且大小写不敏感。你也可以结合范围定义与单个字符定义。<<[0-9a-fxA-FX]>>匹配一个十六进制数字或字母X。再次强调一下,字符和范围定义的先后顺序对结果没有影响。

·字符集的一些应用

查找一个可能有拼写错误的单词,比如<> 或 <>。

查找程序语言的标识符,<>。(*表示重复0或多次)

查找C风格的十六进制数<<0[xX][A-Fa-f0-9]+>>。(+表示重复一次或多次)

·取反字符集

在左方括号“[”后面紧跟一个尖括号“^”,将会对字符集取反。结果是字符集将匹配任何不在方括号中的字符。不像“.”,取反字符集是可以匹配回车换行符的。

需要记住的很重要的一点是,取反字符集必须要匹配一个字符。<>并不意味着:匹配一个q,后面没有u跟着。它意味着:匹配一个q,后面跟着一个不是u的字符。所以它不会匹配“Iraq”中的q,而会匹配“Iraq is a country”中的q和一个空格符。事实上,空格符是匹配中的一部分,因为它是一个“不是u的字符”。

如果你只想匹配一个q,条件是q后面有一个不是u的字符,我们可以用后面将讲到的向前查看来解决。

·字符集中的元字符

需要注意的是,在字符集中只有4个 字符具有特殊含义。它们是:“] ^ -”。“]”代表字符集定义的结束;“”代表转义;“^”代表取反;“-”代表范围定义。其他常见的元字符在字符集定义内部都是正常字符,不需要转义。例如,要搜索星号*或加号+,你可以用<<[+*]>>。当然,如果你对那些通常的元字符进行转义,你的正则表达式一样会工作得很好,但是这会降低可读性。

在字符集定义中为了将反斜杠“”作为一个文字字符而非特殊含义的字符,你需要用另一个反斜杠对它进行转义。<<[\x]>>将会匹配一个反斜杠和一个X。“]^-”都可以用反斜杠进行转义,或者将他们放在一个不可能使用到他们特殊含义的位置。我们推荐后者,因为这样可以增加可读性。比如对于字符“^”,将它放在除了左括号“[”后面的位置,使用的都是文字字符含义而非取反含义。如<<[x^]>>会匹配一个x或^。<<[]x]>>会匹配一个“]”或“x”。<<[-x]>>或<<[x-]>>都会匹配一个“-”或“x”。

·字符集的简写

因为一些字符集非常常用,所以有一些简写方式。

<>代表<<[0-9]>>;
<>代表单词字符。这个是随正则表达式实现的不同而有些差异。绝大多数的正则表达式实现的单词字符集都包含了<>。
<>代表“白字符”。这个也是和不同的实现有关的。在绝大多数的实现中,都包含了空格符和Tab符,以及回车换行符<< >>。

字符集的缩写形式可以用在方括号之内或之外。<>匹配一个白字符后面紧跟一个数字。<<[sd]>>匹配单个白字符或数字。<<[da-fA-F]>>将匹配一个十六进制数字。

取反字符集的简写

<<[S]>> = <<[^s]>>
<<[W]>> = <<[^w]>>
<<[D]>> = <<[^d]>>

·字符集的重复

如果你用“?*+”操作符来重复一个字符集,你将会重复整个字符集。而不仅是它匹配的那个字符。正则表达式<<[0-9]+>>会匹配837以及222。

如果你仅仅想重复被匹配的那个字符,可以用向后引用达到目的。我们以后将讲到向后引用。

6.使用?*或+ 进行重复

?:告诉引擎匹配前导字符0次或一次。事实上是表示前导字符是可选的。
+:告诉引擎匹配前导字符1次或多次
*:告诉引擎匹配前导字符0次或多次

<[A-Za-z][A-Za-z0-9]*>匹配没有属性的HTML标签,“<”以及“>”是文字符号。第一个字符集匹配一个字母,第二个字符集匹配一个字母或数字。

我们似乎也可以用<[A-Za-z0-9]+>。但是它会匹配<1>。但是这个正则表达式在你知道你要搜索的字符串不包含类似的无效标签时还是足够有效的。

·限制性重复

许多现代的正则表达式实现,都允许你定义对一个字符重复多少次。词法是:{min,max}。min和max都是非负整数。如果逗号有而max被忽略了,则max没有限制。如果逗号和max都被忽略了,则重复min次。

因此{0,}和*一样,{1,}和+ 的作用一样。

你可以用<<[1-9][0-9]___noise___ 1072>>匹配1000~9999之间的数字(“”表示单词边界)。<<[1-9][0-9]___noise___ 1071>>匹配一个在100~99999之间的数字。

·注意贪婪性

假设你想用一个正则表达式匹配一个HTML标签。你知道输入将会是一个有效的HTML文件,因此正则表达式不需要排除那些无效的标签。所以如果是在两个尖括号之间的内容,就应该是一个HTML标签。

许多正则表达式的新手会首先想到用正则表达式<< <.+> >>,他们会很惊讶的发现,对于测试字符串,“This is a first test”,你可能期望会返回,然后继续进行匹配的时候,返回

但事实是不会。正则表达式将会匹配“first”。很显然这不是我们想要的结果。原因在于“+”是贪婪的。也就是说,“+”会导致正则表达式引擎试图尽可能的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下,引擎会进行回溯。也就是说,它会放弃最后一次的“重复”,然后处理正则表达式余下的部分。

和“+”类似,“?*”的重复也是贪婪的。

·深入正则表达式引擎内部

让我们来看看正则引擎如何匹配前面的例子。第一个记号是“<”,这是一个文字符号。第二个符号是“.”,匹配了字符“E”,然后“+”一直可以匹配其余的字符,直到一行的结束。然后到了换行符,匹配失败(“.”不匹配换行符)。于是引擎开始对下一个正则表达式符号进行匹配。也即试图匹配“>”。到目前为止,“<.+”已经匹配了“first test”。引擎会试图将“>”与换行符进行匹配,结果失败了。于是引擎进行回溯。结果是现在“<.+”匹配“first tes”。于是引擎将“>”与“t”进行匹配。显然还是会失败。这个过程继续,直到“<.+”匹配“first”与“>”匹配。于是引擎找到了一个匹配“first”。记住,正则导向的引擎是“急切的”,所以它会急着报告它找到的第一个匹配。而不是继续回溯,即使可能会有更好的匹配,例如“”。所以我们可以看到,由于“+”的贪婪性,使得正则表达式引擎返回了一个最左边的最长的匹配。

·用懒惰性取代贪婪性

一个用于修正以上问题的可能方案是用“+”的惰性代替贪婪性。你可以在“+”后面紧跟一个问号“?”来达到这一点。“*”,“{}”和“?”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“<.+?>”。让我们再来看看正则表达式引擎的处理过程。

再一次,正则表达式记号“<”会匹配字符串的第一个“<”。下一个正则记号是“.”。这次是一个懒惰的“+”来重复上一个字符。这告诉正则引擎,尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少,于是“<.+”现在被扩展为“”。这次得到了一个成功匹配。引擎于是报告“”是一个成功的匹配。整个过程大致如此。

·惰性扩展的一个替代方案

我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集:“<[^>]+>”。之所以说这是一个更好的方案在于使用惰性重复时,引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。

最后要记住的是,本教程仅仅谈到的是正则导向的引擎。文本导向的引擎是不回溯的。但是同时他们也不支持惰性重复操作。

7.使用“.”匹配几乎任意字符

在正则表达式中,“.”是最常用的符号之一。不幸的是,它也是最容易被误用的符号之一。

“.”匹配一个单个的字符而不用关心被匹配的字符是什么。唯一的例外是新行符。在本教程中谈到的引擎,缺省情况下都是不匹配新行符的。因此在缺省情况下,“.”等于是字符集[^

](Window)或[^
]( Unix)的简写。

这个例外是因为历史的原因。因为早期使用正则表达式的工具是基于行的。它们都是一行一行的读入一个文件,将正则表达式分别应用到每一行上去。在这些工具中,字符串是不包含新行符的。因此“.”也就从不匹配新行符。

现代的工具和语言能够将正则表达式应用到很大的字符串甚至整个文件上去。本教程讨论的所有正则表达式实现都提供一个选项,可以使“.”匹配所有的字符,包括新行符。在RegexBuddy, EditPad Pro或PowerGREP等工具中,你可以简单的选中“点号匹配新行符”。在Perl中,“.”可以匹配新行符的模式被称作“单行模式”。很不幸,这是一个很容易混淆的名词。因为还有所谓“多行模式”。多行模式只影响行首行尾的锚定(anchor),而单行模式只影响“.”。

其他语言和正则

增加PJBlog2 v2.6 build 02 的重置用户密码功能

  今天一朋友在这我这博客上的用户名的密码忘了,让我找回来。我去后台用户管理里一看,没有修改用户信息的功能,再到数据库和程序里一看,也不是一般的加密,就干脆用他自带的加密再做一个重置用户密码的功能。
  做的过程中,对这个博客的后台管理程序的写法又熟悉了一点。
  东西做出来了,虽不是什么好东西,也不敢独享,将修改步骤写出来供大家参考:
  1、在common文件夹下的control.js里添加一函数:[code] function rePwd(id){
if (confirm('是否重置该用户的密码?')){
document.forms[0].whatdo.value=”RePwd”
document.forms[0].DelID.value=id
document.forms[0].submit()
}
}
[/code]
  2、修改根目录下的ConContent.asp
  在帐户管理的帐户列表的适当处增加一列,在其中增加一个链接,代码如下:[code])”>重置密码[/code]
  若想作得美观点,可以像删除一样做一个小图片,再加上链接。
  在ConContent.asp找到以下代码(大概在2330行)[code] session(CookieName&”_ShowMsg”)=true
session(CookieName&”_MsgText”)=”“”&DelUserName&”” 删除成功!”
Response.Redirect(“ConContent.asp?Fmenu=Members&Smenu=Users”)
[/code]
在后面加上以下代码:[code] '————————重置密码为123456,By Lee 2007.06.29
elseif Request.form(“whatdo”)=”RePwd” then
dim ReUserID,ReUserName,strSalt,password
ReUserID=Request.form(“DelID”)
strSalt=randomStr(6)
password=SHA1(“123456″&strSalt)
ReUserName=conn.execute(“select mem_Name from blog_Member where mem_ID=”&ReUserID)(0)
conn.execute(“update blog_Member set mem_Password='”&password&”',mem_salt='”&strSalt&”' where mem_ID=”&ReUserID)
session(CookieName&”_ShowMsg”)=true
session(CookieName&”_MsgText”)=”“”&ReUserName&”” 的密码成功重置为123456!”
Response.Redirect(“ConContent.asp?Fmenu=Members&Smenu=Users”)
[/code]
  好了,大功告成了!

  和我用同个版本的朋友且自己没有修改过这两个文件的也可以下载下面的附件覆盖一下相同的文件。
common文件夹下的control.js:
[down=attachments/month_0706/82007629224123.rar]点击下载此文件[/down]
根目录下的ConContent.asp
[down=attachments/month_0706/t2007629224135.rar]点击下载此文件[/down]

  适用于PJBlog2 v2.6 build 02 ,其它版本的,可以按此思路来做。
  希望此文能解你破密码之苦。
  有问题请留言!

[color=Blue]更新:[/color]
无需登录,重置用户密码,对于忘了管理员密码的朋友很有帮助:
[down=attachments/month_0706/resetPwd.rar]点击下载此文件[/down]

盗版xp成功验证成正版,享受正版增值服务

  你的盗版xp通过微软的正版验证了吗?是不是安装了WGA正版验证补丁KB905474后,就有个盗版提示呢?你知道吧,如果你的XP通过正版验证,就会享有更新到IE7和WMP11等正版增值服务!就算是安装了WGA正版验证补丁,也不会出现那个盗版提示了,因为你已经是正版啦!那赶快把你的XP验证成正版吧!
  下载下面的工具其一,可以把你的盗版xp成功验证成正版,享受正版增值服务!等验证成正版后,为了感受正版增值体验,咱装个中文正版的IE7先吧!

必要的下载(任意其一即可): [url=http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=1625848]推荐下载1[/url] [url=http://dl4.ohshare.com/v/7694490/xp_patch.rar.html]推荐下载2[/url] [url=http://zhaodx.dearinfo.com/files/download.php?id=18caec5a8b35723549edda80d8240532]下载3[/url] [url=http://www.mydatabus.com/public/zhaodx/xp_patch.rar]下载4[/url] [url=http://www.box.net/rssdownload/63322860/xp_patch.rar]下载5[/url] 本文出自:http//hi.baidu.com/zhaodx

1。在连网状态下,点“验证XP是否为正版”,许可并安装插件,等待一会!如果出现“感谢您使用 Windows 正版增值计划 计划。现在您可以访问正版 Windows 用户资源。”即为正版,否则就是盗版!若不放心,去官网验证:http://www.microsoft.com/genuine/selfhelp/support.aspx

2。如果验证为盗版,运行“XP_VLK序列号更换器.VBS”,然后再次点“验证XP是否为正版”,验证通过就可享有安装IE7等其它正版服务!不能通过请再次运行“XP_VLK序列号更换器.VBS”并更改默认序列号为最下★处提供的其它序列号,直到验证成功为止!

3。下载中文正式版IE7, 地址:
天空下载(速度快)http://www4.skycn.com/soft/30276.html
官网下载(稍慢) http://download.microsoft.com/download/4/1/8/418981A4-6EF9-4DE6-BEFC-1A53E886CB62/ie7-windowsxp-x86-chs.exe

4。安装IE7不用断网和卸载IE6,直接运行下载的IE7-WindowsXP-x86-chs.exe就行,安装过程中要求验证,尽管放心验证,因为你已经是正版了!

5。装好了,怎么看不到“菜单栏”啊,原来IE7“菜单栏”默认为不显示,在IE7窗口,点击“工具”按钮,勾点“菜单栏”,可显示“菜单栏”,但默认“菜单栏”在“地址栏”下面,而且不能常规修改,对于习惯IE6的朋友很别扭!解压“IE7菜单栏置顶.rar”吧,里面有详细的修改方法!

6。如何让“链接”在同一窗口中的新选项卡中打开:用鼠标的中间滚轮键点链接或Ctrl+左键点链接

【提问】我不注意安装了微软最新WGA正版验证补丁KB905474,屏幕右下角总有有个盗版提示的蓝色五角星,咋办啊?
如上,通过改序列号,验证成正版,盗版提示自然就没啦!你还可以解压KillWGA-KB905474.rar 运行里面的“installer.bat”,重启,也可去除盗版提示!

【提问】说了半天我更本就不能验证成变成正版,咋安装IE7啊?
不能验证成正版同样装IE7: 解压“破解IE7.rar”,运行“破解IE7验证.exe”,断网安装IE7就可以了!记得一定要断网安装哦!

【提问】IE7有啥新功能啊?
  IE7支持流行的单窗口多卡式浏览,不仅加强了安全功能,还支持一键清除全部上网纪录,及RSS订阅等新功能。笔者测试比原IE6打开网页稍快!注意安装IE7首先保证你是SP2系统

【提问】为何我的验证无法通过(无法进行)啊?
  首次验证将要求您安装ActiveX 控件的,请许可下载并安装ActiveX控件!无法顺利进行验证的可能是你的浏览器禁用了Active控件运行!请打开http://www.microsoft.com/Genuine/diag/default.aspx?displaylang=zh-cn点‘开始诊断’!需要一点时间哦!最后按提示完成验证!
  如果还不行点此,打开后直接点‘运行’。或用这个RemoveWGA也能去掉星号。
【提问】我的不知是不是vol版xp啊,无法验证成正版啊?
  有部分精简版的 xp 竟然把 VBScript 给精简了,导致更新失败,下载微软正版验证安装离线包或使用木蚂蚁的XP正版验证补丁试试。
访问东东藏宝阁查询更多相关 http://hi.baidu.com/zhaodx

本页出处(转载请保留) http://hi.baidu.com/zhaodx/blog/item/78219e503dc5826385352446.html

还有任何疑问进QQ群咨询: 入QQ群: 23760346 或 18080520

★下面是Windows xp pro sp2 vlk 微软授权正版序列号,笔者2007.4.17测试通过!

用法:点“XP_VLK序列号更换器.VBS”换号,点“验证XP是否为正版.hta”验证!

如果用默认的序列号不能验证为正版时,偿式更换以下序列号:

CM3HY-26VYW-6JRYC-X66GX-JVY2D

BYCMB-R844W-KJBQX-J3D9F-V3Y6G

DDQXW-THQ8M-79V6K-2YFGH-R793Q

DP7CM-PD6MC-6BKXT-M8JJ6-RPXGJ

八尾猫

  “在古埃及的神话中,猫扮演着很重要的角色。据说在很久以前,猫统治着人类,它们狡诈,残忍而非常聪明。它们把人类当成奴隶驱使。知道最后狗的出现,他们赶走了猫,并让猫从统治者变成了人类的宠物。于是狗被埃及人当成了生活中最重要的朋友。而且埃及人深信猫会带来死亡。”朋友喝着茶,缓缓道来。
  “只有埃及的神话涉及到猫么?”我四下望了望,那可爱的小猫又出去鬼混了。
  “当然不,我今天讲的就是一只东方猫的故事。”朋友笑着叙说。
  “据说当时佛祖说过,世间反是有七窍者皆可修炼成仙。所谓七窍其实按今天的话说就是生物吧。猫自然也算其中。而且据记载。修炼的猫每过二十年就能多长出一条尾巴,当尾巴长到第九条的时候,它就能修到一定的境界了。
  但这第九条尾巴可不好长,当一只猫拥有八条尾巴的时候,它会得到一个提示,它必须去满足一个人的愿望。而每实现一个愿望,猫就必须消失掉一条尾巴来实现。所以这几乎成了一个死循环。但我所说的猫确非常虔诚的完成这个循环。所以它虽然一直是八条尾巴,但已经不知道活了多少年,也不知道帮多少人达成过愿望了。它也曾经向佛祖抱怨过,这样下去如何才能修炼得道?佛祖去笑而不答。”朋友停了一下,神秘地说:“其实上面的话我只是听我的祖辈们谈起罢了。因为八尾猫不会随便帮助人,它只会帮它第一人主人的后代实现愿望。在我的家乡,八尾猫的传闻是很普遍的,大家都希望可以遇见它,因为它如果愿意帮助你的话,你能实现任何愿望,任何愿望。”
  我望着,隐约记起他继承遗产前去过一次家乡,我不禁问他:“难道你有见过它?所以你才能继承这样一笔遗产?”
  “傻瓜,我父母早去世了,遗产只是我到了父母规定的大学毕业就能接受的。”朋友大笑。笑的我也有些窘迫。
  “不过那次我回去,的确知道了些八尾猫的故事。”
  “我的家乡是个物产十分丰富的地方,当然老鼠也很多,为了解决鼠患,从很早以前家家户户都会养猫。很奇怪,我们当地没有一个人养狗,我们也从来不吃狗肉。猫的存在给了当地人很大的实惠。没有老鼠的侵扰,粮食丰收,也不会传播疾病。所以大家对猫都疼爱有加。而猫的传说自然也很多。
  我所知道的第一个是我的叔祖父告诉我的。他去年已经过世了。当时他和我叙述这个事的时候依然健硕,老人虽然将近八十了,但鹤发童颜,说话清楚利落。只是眼睛深深的凹陷,猛一看有些吓人,因为有严重的白内障,他又及不愿做手术,也只好这样。
  为了方便叙述,下面是以他的口气来说的。
  “那年我和你阿公(我祖父)才十来岁。村子后面有座山。我们经常上山去玩,或者运气好可以打到一些小动物,要知道,农村的孩子很早就会自己养活自己了。当然,我们知道山上有狼,可我们一般不走远,只在山腰,而且你阿公很会辨别狼的领地,他知道那些地方是去不得,那些地方可以去。
  在以前我们也听说过村子里有八尾猫的传说,据说它是几百年前村子的一位少年饲养的,是一只身材非常大的猫。大到几乎可以和普通的狗一般。而且全身通体雪白,尾巴有粗又长。当时的人对这只猫都很敬畏。他们认为这只猫可能就是猫里面的猫妖。
  在少年去世后,这只猫就不见了,然后陆续有人宣称看过这只猫,而这个少年的后代无一不是飞黄腾达。最后成了村子里有名的望族。大家都认为这是猫妖的福赐。但少年的后代决口不提。因为在禁忌中,如果把你和八尾猫的故事告诉旁人会折寿的。不过反正我也活够了,告诉你也无所谓(说到这里,叔祖父爽朗的笑着)。
  那天天气本来是很好的,但六月份的天气在树分钟内都会变化,即便像我这样观察天气的好手也疏忽了。那次我没有叫你阿公同去。因为他已经要去省城上学堂了。不能像我这样野了。所以我独自一人想去山上摘点口菇或者打点野味。可没等我走到山腰。就下了好大的雨,回想我这几十年从来没再遇见过那样的暴雨。我只好找了个树叶比较茂密的地方躲了一下。天空灰暗的紧,空气也很压抑。我几乎忘记这是早上了。就在暴雨和闪电交加的时候,我隐约听见狼的叫声。照理这个时候,而且又在下暴雨狼是决不可能出来觅食的。但很快第二声狼嚎证实了我的猜测。
  还没等我走,我已经看见四只狼已经把我包围起来。我不是第一次见狼,以前随父亲上山打过狼。但那时后只是跟着大人后面玩玩。但这次我可能真要沦为狼果腹的食物了。我开始打抖,也说不清楚是害怕,还是被雨浇得。
  四只狼都是成狼,在雨水中他们的毛发都紧紧粘在一起,这让他们的身形很彻底的展示出来。我甚至可以数的清他们的肋骨有几跟,看来他们是饿了很久了。我就这样和他们对持着,我知道狼不会一下攻击你。它们会细心的,有耐心的观察,寻找最好的机会保证一击必中。我自己也不知道或许下一秒我的喉咙可能就会被撕开了。
  这时候,我看见狼忽然在退缩,口中还不时的发出低吼,我知道那是带着威胁和恐惧的吼叫。我四处望去。果然我看见了它。
  它的身长几乎超出我的想象,几乎可以算是一头小狮子了。但浑身雪白,雨似乎根本碰不到它漂亮的毛发。眼睛如同两颗黑色玛瑙,泛着不详的光。而且最醒目的是它的尾巴。是八跟,就像皇帝出巡的依仗一样散立在后面。
  我突然想起,村里人都说,八尾猫通常会在不寻常的暴雨中出现,而且会寻找需要实现愿望的人。
  狼很快被吓跑了。八尾猫也信步走到我面前。在它面前我几乎忘记自己是一个人,一个本应该凌驾与众多生物的人。我觉得自己很渺小。但我又渴望拥有它,因为它实在太美了。(说到这里,叔祖父的眼神很柔和,望着前方,几乎沉浸在以前的记忆中)
  它轻摇了下尾巴,然后摇了摇头,伸了个极长的懒腰,然后望着我。
  我知道它在等我提出要求。原来我们家就是那个少年的后裔,这让我又激动又兴奋。但它突如其来的到达又让我手足无措,我真的没想好我该让它帮我实现什么愿望。我小心的问它:“我可以摸摸你么?”
  它没有表情的眯着双眼,这个时候雨已经停了。太阳很快又出来了。它白色的毛发居然在阳光下成了半透明的状态。可能它答应了。所以我用颤抖的双手摸了摸它脖子附近的毛发。
  人一生会摸过很多东西,那些手感好的有丝绸,缎子,光华的瓷器,或者年轻女人的皮肤。但八尾猫的毛摸起来感觉和我所摸过的毛发不一样。不像普通的猫毛那样杂乱,也不像别人送给我们狐狸皮毛那样柔软。不知道是什么一种感觉,但摸着很舒服。我的手仿佛粘在那里了。我甚至想就这样枕着它的皮毛睡过去。
  不过它很快就躲开了,或许它不喜欢太靠近人累。我知道它还在等我的愿望,它的八跟尾巴在不安分的晃来晃去。我实在不知道要实现什么愿望,只好对它说要不先跟我回家,等我想到在告诉你。
  八尾猫望着我,忽然全身闪耀了一下,几乎晃的我睁不开眼睛。然后我在地上看到了一只猫。一只和普通毛没什么两样的白猫,而且,只有一只尾巴。
  我知道它是八尾,我高兴得把它抱起来,兴奋的往家里回去了。
  接下来的日子我几乎每天都和八尾猫玩耍。村子里的大人不会干涉孩子和猫玩。反正那时候我又不愿意和你父亲一样去读书,家里又富足,也就由着我性子瞎混呗。但八尾起初很不愿意这种玩耍。每当我像逗其他猫一样把纸团毛线球之类的扔给它。它总是无动于衷的望着我。就像一个老人看幼稚的孩子一样。我终于意识到这样逗它其实是对它的不尊敬呢。
  它每天都对我叫唤,要不就摇着尾巴蹲在门口。我知道它不想呆在这里。它想尽快满足我的愿望,少一跟尾巴,然后又重复那样无休止的修炼。望着它的背影我觉得它很可怜。
  那天我坐在它面前问它:“是不是所以愿望都能实现?”
  它没做声,只是懒洋洋的望着我。
  “那,我的愿望就是你能有九跟尾巴。”我一字一顿的说。
  八尾猫呆住了。黑色玛瑙般的眼睛充满了疑惑,随后是一种后来我知道名为感恩的眼神。或许它终于明白佛祖的意思,只有遇见个肯让它圆满的人所提的愿望,它才能有九条尾巴。以前的人都自私的为自己考虑,他们认为八尾猫为他们实现任何愿望都是因该的,他们不会考虑八尾的感受,因为每一条尾巴都必须经历几十年的修炼。
  八尾猫慢慢的起身,伏在我面前,舔了下我的手,很温暖。我看见它的眼睛有些湿,或许是眼泪吧
  八尾不能在叫八尾了,我看见它长出了九条尾巴,是那样华美壮丽,它的身体闪烁着白光。以至后来同村的铁蛋一直赌咒说那天看见我家闪着白色的强光。
  我目送着它离去,还是有些失落的。我知道我这辈子不会在和它见面了。
  不过似乎以后的日子冥冥之中都受到了它的庇护吧,我这一辈子没什么作为反而过的快乐而安详,我的子女都很孝顺,我的身体非常健康。或许都是托它的福,还有,昨天我梦见它了,它说它就要来接我了。”
  上面就是叔祖父的叙述,当时的我听完只能将信将疑,我知道医学上有种病是意想。多发为老人身上,他们身体很健康,但记忆却混乱。他们往往把一些不相干的事串联在一起组合我自己所谓的记忆。我不知道是否叔祖父也有这种病。
  但很快,在我离开家乡前他老人家就过世了。走的非常之安详。就是白天睡在藤椅上走的。家里人也说了,这,叫喜丧。
  在葬礼上,我是我那辈最长的。所以第一天的灵是我来守,那晚发生的事证实了叔祖父的故事。
  大概凌晨两点后,大部分人都散去了,只有几个守灵的人还在,不过大都已经睡死过去。但我却出奇的清醒。一想到前几天还和我谈笑风生的亲人一下就阴阳两隔我多少有点悲伤。但在寂静的夜晚,我却听见了一声猫叫。并非像电影里的那样恐怖诡异,却充满了温柔的叫声。
  我也看见了,看见了八尾猫,不,应该称它为九尾了。如叔祖父描述的一样,第一次见它的人都会惊叹与它的美丽。白色如雪般的毛发却有着漆黑如墨玉般的双眼。而且那漂浮的九条白色的尾巴更加显的雍容华贵。
  它向我径直走来,全然没有理会我的惊讶。我很想叫醒其他人。但嘴却什么也说不出来。
  我就看着它走到叔祖父的灵柩前,像叔祖父当年和他离开时一样,舔了舔他的手,然后就如一阵烟一样消失了。
  过了很久,我发现我才能说出声来。但我没告诉其他人,我知道这无非招惹一顿嘲笑而已,而且在这样严肃的丧葬期间说这个在我们那里是很避讳的。结束叔祖父的葬礼后我才又回到家。而且以后我也再没见过八尾猫了。它的传说似乎也终止了。”
  “好神奇的猫啊。”我忍不住感叹道。
  “的确,不过你相信么?”朋友问我。
  “当然,如果别人说我可能不会相信,但你说的再离奇我也是确信的。”我坚定地说。
  “那就好,人生得一知己死而无憾,有你相信就够了。”朋友笑着拍拍我肩膀,示意我早点休息。我知道今晚的故事结束了。当朋友出去后。房间又恢复我一个人的寂静。这时,朋友那只猫又从外面回来了。我看着这只可爱的猫咪,心想,它会不会就是那只八尾呢。如果谁有缘看到八尾猫的话,记住一定要向它提让它有九条尾巴的愿望,因为徘徊在人世的他们是很孤单寂寞的。

高效程序员应该养成的七个习惯

高效程序员应该养成的七个习惯
2006.02.05 来自:zeali 

对于软件工程师来说,工作也许意味着许多东西 — 稳定的收入、做自己感兴趣的项目、找一份更好工作的跳板,或者你只是喜欢与其他程序员共事。但说到“效率”,强调的是在一定时间内按质完成项目的能力。

理解你的需求
成为一个有效率的程序员首先要知道如何正确的支配自己的时间。对时间最大的浪费莫过于去做那些没有用处或者永远不会上线的项目。而导致这种结果的根源往往是对需求理解的偏差。
要最大程度避免这种情况的发生,最好的办法是快速建模,尽可能让演示系统早点出来。对于客户来说,只有看得到摸得着的产品摆在面前,他们才会有兴趣去试用观察,才会在实际的操作中发现供需双方在需求理解上的偏差。否则即使你写上几百页的需求分析文档也只能是自己的一面之词,客户可没耐心去检查这些文档写的是否准确。
另一方面,你应该让每一个阶段的开发成果都能够尽早的提交给客户。让他们以完全不考虑操作合理性和业务逻辑性的傻瓜级操作来发现程序员编程中的固有思维局限。尤其必须让QA尽早的介入到项目开发中来。如果能够每天提交一份测试版本给QA自然是最理想的了,但大多数项目开发做不到这样的粒度,那么就争取每周提交一份可测试版本。重要的是应该让QA和开发能够保持交错并行状态。只有这样,才能让QA尽早发现bug,降低每个bug的修复成本,同时缩减独立测试周期的跨度。
程序员往往不愿意把半成品代码交付给测试人员,相反他们更喜欢在所有代码都完工,达到自己满意的程度之后再让别人来测试。因为在这之前的代码往往存在很多程序员自己知道需要修改(或者故意留待后续补全)的流程缺失和Bug,测试人员并不知道哪些是真正的Bug,哪些只是临时性的运行错误,每次都会一股脑儿作为Bug反馈给程序员。这往往让程序员们心烦。同时测试人员有时候也不喜欢测试这种很多分支都走不通的中间版本。
但不管喜不喜欢,测试并发现问题是测试人员的工作;程序员则应该认识到,Bug反馈得越早就越是件好事情。QA和开发之间的关系往往很敌对,可实际上双方的目标是一致的。“忠言逆耳”古训有之,对于程序员来说就应该“有则改之,无则加勉”。总好过项目完成之后才发现一堆的问题,到那时候再要做修改,基本上都会牵一发而动全身,痛苦的还是程序员自己。

保持真实性
尽可能让你的系统运行在最接近真实环境配置下面,使用有实际意义的数据和真实的编译版本,并经常性进行模块整合。如果你的测试环境使用的数据都是些胡乱添加的东西,那么将来和测试数据大相径庭的真实数据这块大冰山早晚会撞沉你的程序。另一方面如果你只在开发环境来编译运行测试,会发现正式发布之后有各种各样莫名其妙的问题产生,到最后原来都是因为环境配置与开发环境有些不起眼的差异所导致。把所有模块整合进行编译联调,看上去应该是最后作的一项附加工作,但实际上这是一项需要在开发过程中经常性进行的工作。只有这样QA才能有最完整的东西拿来测试,得到更多的Bug反馈,同时降低模块整合的难度。

理解你的代码
书写规范的代码,并保持代码的整洁。Coding是一门艺术。正如写作一样,同样的文字在文豪的笔下就能够熠熠生辉,读起来赏心悦目;在普通人的笔下大概就只是词能达意的效果了;在某些人的笔下或许就需要研究半天才能猜出个大概来。当然不可能人人都成为艺术家,但至少你可以学会欣赏艺术、学习艺术。书写漂亮的代码是对自己工作的尊重,也是对其他程序员的尊重。如果你的代码中间充斥着大段过时的注释、可读性差的变量/函数,怎么去要求别人或者自己以后能够理解它们?

最优编程
把你的时间花在代码的功能上, 而不是去把现有的代码改得对自己胃口(尤其对于那些copy/paste过来的代码);要找到系统的瓶颈进行优化,而不是对那些无益于系统整体性能提高的地方做无用功。
管理好你自己
也许有人会说计划和进度控制是PM的事情,但一个好的程序员应该比PM更了解自己目前工作的进度。不论上头给的进度计划是否合理,你都应该有自己的原则和概念,清楚知道每天该做什么怎么去做。

持续教育
只有不断的学习、实践、犯错误,你才会真正有所提高。在我看来,对于程序员来说最好的老师不在学校,而在书本、网络、社区。学会自我学习才能保持与时俱进。

R-E-S-P-E-C-T
互相尊重是一切的基础。

SQL Server性能调优入门(图文版)

第一步,在业务高峰期抓取样本数据(2个小时左右)。采用的工具是sqlserver自带的profiler,也叫事件探查器,如下图:

进入后,点击最左面的按钮,建立一个新的跟踪:

登录需要用DBO权限,所以可以用sa登录,也可以用windows集成验证方式(如果当前登录的就是sqlserver的话)

新建跟踪,一共有4个tab页进行配置,首先看第一个。跟踪名称不用更改,默认的即可。保存一共有两种方式,一是文件,扩展名是.trc(这种方式方便你把客户那里的跟踪结果发给你),其二是数据库中的表。

为了分析方便,我们把它另存为表。此时sql提示你重新进行登录,这里我们把表保存到master中

假设表名字叫做jq(如果有重复的,系统会提示是否覆盖)

确定后回到了刚才的第一个tab页中:

然后切换到第二个选项卡中:

左面列出了各种事件类(Event Class),右面是当前已有的事件类。对于性能调优,我们不需要安全审核、会话信息,点击删除按钮即可:

继续切换到第三个tab页上,这里的数据列默认就够了,当然,如果你看着不顺眼,可以把Appname/NT username等都删除。

最后一个tab页上,我们需要把系统自己产生的事件ID屏蔽掉:

把那个排除系统ID进行check即可,如下图:

所有项目配置好后,点击&ldquo;运行&rdquo;按钮。持续运行两个小时左右即可(业务高峰期,能典型的反应客户最近一段时间内的业务模式)

好了,第一步的准备工作完成了,等待一段时间后,我们开始检查刚才自动保存到master中的表jq。

第二步,开始查找影响速度的地方。

打开查询分析器(sql analyzer),登录到master中,从 表jq里面按照I/O倒序,读取若干个sql。根据我的习惯,一般是读取1000条记录。为什么根据I/O来找呢,而不是根据时间来找呢?原因很简单,一句SQL执行,&ldquo;稳定&rdquo;的是I/O,而duration是一个不稳定的因素。我们进行sql调优的目的,就是降低I/O成本,从而提高效率。(一般而言,I/O降低了,duration自然就会降低)详细内容,参考我以前的post:http://blog.joycode.com/juqiang

执行完成后,我们仔细看下面的输出。

1、 XL_TALLY_Proc04这个sp的reads最大,将近100w,duration也达到了25秒多。

2、 Erp_IM_GMBill_GetBill这个sp的I/O不算大,才7w,duration平均都在1秒多点。但是这个sp执行的次数非常多。

经过询问客户,XL_TALLY_Proc04这个sp执行的频度很低,一天也就一两次,但是Erp_IM_GMBill_GetBill大概5分钟就要一次。这样整体I/O就占用的非常大。

所以这里我们要重点分析Erp_IM_GMBill_GetBill这个sp,而不是第一个!

总结一个原则就是:调整的重点是客户最关心的内容,是执行频度最高、看起来I/O又比较大的那种。I/O最大的,不一定是我们要优先解决的内容。

第三步,开始分析刚才看到的那个语句。既然我们要分析I/O,那么就要把I/O打开,这样每次调整sql,我们都能随时看到I/O的变化情况。这句很有用处地:set statistics io on

单纯看I/O变化,我们会晕倒的。因为我们不知道自己做的任何改动,对I/O是如何产生影响的。所以,还要看sql的执行计划是怎佯的。 在查询分析器中,我们按Ctrl+K,或者如下图的菜单,check上即可。

好了,准备工作都做好了,下面开始干活了。

我们首先看sql语句的调优,假设下面这条sql语句性能低下:

上面的sql一共读取了6636条数据,逻辑读是1126。那么这个I/O是否合理呢?大了还是小了?还有改进的余地吗?我们看执行计划:

哦,一共4个咚咚在里面。Index seek的成本占了2%, index scan的占了47%,hash match占了51%,select最终是0%。我们应该牢记第二个原则,所有的index,尽可能的都走index seek。

我们看一下billsoflading的索引信息:

当前索引为什么走scan,这里就不说了,感兴趣的可以随便找一本介绍数据库索引的书籍来看看即可。根据我以前那篇blog的描述,我们知道应该建立一个复合索引(也叫convered index):boldate+companyid+bolcode

然后我们重新执行sql,看看I/O变化情况:

Ooh,非常cool!logical reads降低到了50。为什么会这样呢?我们看一下执行计划:

原来是index scan变成了index seek,效率自然大大的提升!

Sql语句在index上调优的方法,基本就是这样。我们继续看sp的。

&nbsp;

对于sp的调优,有一点是和sql调优不同的:sp内部的逻辑处理可能非常复杂。单纯从查询分析器中,我们无法得知哪一小块的sql执行的I/O最大,我们只能看到一个总体的描述。所以,我们要知道sp内部的信息。

首先,了解自己当前的spid是多少。一种方法是select @@spid,另一种方法是看查询分析器下面的status bar的信息。

Ooh,我的spid是101。(上图的最下面那个tips)

然后我重新打开profiler(事件探查器),重新建立一个跟踪,这里面要修改第二个tab页的信息,把左面事件列&ldquo;存储过程&rdquo;中的SmtpCompleted加上

增加后的样子如下:

然后修改第4个tab页,把刚才看到的spid=101的信息填上:

点击运行后,这样profiler只能抓到在查询分析器中,spid=101那个窗口发送的sql。我们切换回查询分析器,执行有问题的sp,执行完成后,我们再回到profiler,点停止按钮。一个sp内部所有执行的sql,都被分开了!

这次的结果假设保存在了jq2表中,我们把所有执行的小片sql都列出来:

第一个是sp执行后的总体结果,I/O为62328,就是这个sp自己的。第二个是向临时表中插入数据,I/O为61514,我们很容易看到,这一句占用了整个sp的大概95%以上的成本。如果我们把这句insert into #temptable搞定,整个sp的成本自然就下来了。所以我们需要把这句insert搞出来。

但是慢着!default情况下,sqlserver的results只显示很少的字符,第二行的sql,我们根本抓不全的,所以我们需要修改一下设置。在查询分析器的工具-选项菜单中,切换到&ldquo;结果&rdquo;这个tab页,修改每列最多字符个数为8192(这是最大的允许值),然后点击&ldquo;确定&rdquo;按钮,重新从jq2中读取信息。也许你会问,如果某个sql特别长,怎么办?其实很简单,在你的代码中把这句sql单独写到log中,或者直接修改sp,把这句print出来即可。

Ok,我们把这句insert sql抓下来后,放到查询分析器中。因为temptable我们没有它的结构,所以我们把insert部分注释掉,看后面的select语句。执行后,ooh,在goodsmovement表上的成本是57834。

老办法,我们继续看执行计划:

其实,现在又回归到了sql调优的步骤,下面的工作我就不写啦!

&nbsp;

这个步骤,看起来很简单,希望大家对于sql调优(索引部分)心中都有这么一个概念,知道第一步作什么,第二步作什么。还是那句话,索引调优,基本上是最简单的。但是貌似简单的东西,我们越应该重视。你随便找一个应用跟踪一下,各种效率低下的索引,会让你实在#¥*#(**&hellip;&hellip;¥

打不开删不掉的特殊文件夹的建立与删除等

附创建一个打不开删不掉文件的方法

以建一个6618.文件夹为例:
1、在命令提示符下输入:
md 6618../

2、你就会发现建成了一个6618.的文件夹。

3、这个文件夹双击打不开也删不掉,同时普通模式下也删不掉。
如下两幅图:

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

4、那如何放文件进去呢?可以用COPY命令复制文件进去。
copy 文件名 d:/6618../

5、那如何打开这个文件夹呢?
在运行中输入完整的路径和文件夹的名称就行了,如下2幅图:

6、那如何删除呢?看下图:

原理:用了windows的非法命名
好处:自已想吧
用过矮人DOS5.0版的朋友应该就知道,装了它后,分区中有一个argho.的文件名,其生成原理我这里发的帖子是一样的。这个是nt系列系统的bug,在dos或者win9x下就可以正常访问nt系统创建的这种文件夹,但不能创建此类文件夹。如果是NTFS格式,9X就无能为力了。病毒利用MS的其他BUG进行攻击,矮人利用MS的这个BUG进行备份GHO,最了不起的是:GHOST.EXE在DOS下能认识这样的文件夹&mdash;&mdash;兼容MS的这个BUG。

再有一种文件夹是可以正常打开不能删的

创建:MD &quot;D:/6618 / &quot;

删除:RD /Q /S &quot;D:/6618 / &quot;

注意:引号最好要有,还有空格,如:&quot;D:/6618空格/空格&quot;

再来个看不见的

MD D:/…/

RD /Q /S D:/…/

注意:这个文件夹在资源管理器里是看不见的,命令提示符就能看见
打开方式:运行(win+r)输入D:/…/

注意哦使用RD /s /q D:/…/少个.会把D盘文件都删除了!!!!!!!!!!

补充一个,可以正常打开当然也是不能通过资源管理器删除
大家都知道在资源管理器里是不能用空格命名文件夹的

创建:MD &quot;D:/ / &quot;

删除:RD /Q /S &quot;D:/ / &quot;

注意:引号最好要有,还有空格,如:&quot;D:/空格/空格&quot;

&nbsp;

补充说明:

一、

如果你建个md 6618../这样的非法文件夹。

再在资源管理器中建个6618的文件夹。原来的6618.就可以打开。不过看不到里面的文件。而且可以删除6618.文件夹。不过删了6618.文件夹的话。里面原来的文件会跑到后面建的6618文件夹里去。这个6618文件夹也会变得无法删除。无法打开。

但如果是运行*:/6618../的话,还是可以看到里面的文件。

6618.文件夹和6618文件夹同时存在的时候,可以给6618.文件夹改名成6618文件夹.这时就同时存在两个6618文件夹
但如果你删除其中的一个文件夹后,刷新后,还是会返回成6618.文件夹
在xp的命令行可以轻松建立这样删不掉的文件夹,可在纯dos下却不行!

md 6618../

二、

建一个不带&quot;.&quot;&nbsp;&nbsp; 功能与带&quot;.&quot;&nbsp;&nbsp; 的&quot;bug文件夹&quot;:

1.md 建立一个带&quot;.&quot;文件夹,如:md 6618../
2.建立一个普通文件夹(名称同上面带''.&quot;,没点,如普通方法右键建里文件夹 6618)
3.普通方法删除带点的文件夹
4.后面留下的6618文件夹也是普通方法打不开,删不掉,同原6618.文件一样用,就是名称上看起来没&quot;.&quot;

三、再来伪装&quot;bug文件夹&quot;

1.建6618.文件
2.copy命令复制文件进6618.文件
3.普通建6618文件
4.此时可以打开6618.与6618,且两文件夹似乎使用的是同样的磁盘空间,普通方法复制进其中一个文件夹,另一个文件夹会有同样的文件出现.但是在第2步中copy进文件夹的文件不会显示.
5.两个文件都可以用普通方法删除,但是不管是删除哪个(6618.或是6618),剩下的那个文件夹(6618或是6618.)与第1步中建立的6618.具有相同功能,普通方法不能打开,不能删除.
6.命令删除,添加文件方法,就是大家一起在讨论的
7.所以可以建立名称如同普通文件夹一样的&quot;bug文件夹&quot;(只是名称看起来一样而已),可以把一些想保护起来的文件放到里面,免于误删,被该等问题.

一些有意思的现象:

1、如果把文件拖到这个*.文件夹里。那么,他马上会生成个*(同名文件夹)并且拖进去的文件可见,但是见不到之前用在运行D:/*../拷进去的文件。并且。如果在拖进文件之后用D:/*../进去看。是看不到拖进去的文件。你把这同名的两文件夹删掉其中之一后,用运行D:/*../进去看。还是看不到拖进去的文件。

2、我们可以先建立一个如wuyou的文件夹。再把其设为隐藏属性,然后再利用WINRAR这个软件来对其文件夹命名为WUYOU../至此大功告成,其文件夹达到一般不可删除,隐藏的的功能.再把文件夹选项设为不显示隐藏文件.

3、现在只是在2000里运行里用*../进入不了文件夹,在XP里就可以进入

4、在分区建立资源管理器看不见的这个目录,分区必须是FAT32格式,NTFS是无法建立的

5、其实分区里面*.文件是可以删除的,(注意是文件不是文件夹)
方法如下,
用DIR/X来获取*.文件的短文件名.
再用DEL来删除.
看演示

dir /X 显示为非 8dot3 文件名产生的短名称。格式是 /N 的格式,短名称插在长名称前面。如果没有短名称,在其位置则显示空白。

请不要忽视健康体检的重要性

  定期体检是一种保障健康的有效手段。有些原来自认为健康的人,被发现患病时,已经出现了肾衰竭;有些自认为没病的人,被发现肝硬化;有的乙肝病人被查出转氨酶很高,处于传染期,急需住院隔离……这样的事例还有很多,而如果能做到定期体检,就可及早发现潜在的致病因子、早期病灶或功能异常等情况,达到早期发现、早期治疗的目的。

  健康体检是一种新的自我保健方式,它可以变被动看病为主动检查,变消极治病为积极防病。医疗专家认为,看似健康的人也应该每年或至少两年进行一次体检,因为定期体检能够早期发现一些无痛或症状不明显的疾病。

  某单位职工健康体检,被检总人数为1462人,其中妇女506人。通过这次体检,查出高血压182人,占17.4%;高血脂208人,占14.2%;脂肪肝167人,占11.4%;糖尿病64人,占4.3%;肝癌2人,占0.14%;乳房疾病54人,其中乳腺癌1人,占10.6%(体检妇女)。另据中科院某研究所的一次健康体检发现:被检查的66名中年知识分子,有35人程度不同地患有各种疾病,其中有2人为早期肿瘤。再如深圳市某保健中心对全市26000名青年干部职工的健康档案的调查分析表明:30~45岁年龄段中,高血压发病率近10%,高血脂发病率约占25%,脂肪肝发病率约占20%。以上数字是触目惊心的。健康体检的重要性就在于使这些潜伏在身体里的“定时炸弹”及早暴露,并及时治疗,这对逆转病情,恢复健康,提高生活质量至关重要。花最少的钱获取健康的最佳效益,定期体检不失为上策。(数据来自网上资料)

  从医学角度讲,疾病的发生可分为五个阶段:

  (1)易感染期:此时疾病尚未发生,但危险因子已经存在了;如超重、肥胖、抽烟、酗酒、血压过高等情形的人。

  (2)临床前期:此时疾病因子已在人体内某部位产生病理上变化,但在外观及日常生活尚未有症状出现。

  (3)临床期:此时疾病的症状逐渐地显现出来。

  (4)残障期:疾病晚期。

  (5)死亡:功能的破坏影响生理代谢作用,引发身体重要器官步入衰退期,导致死亡。

  在一般情况下,一个人都会等到疾病的症状已出现时才会想到去找医师,其实那时的疾病已达到临床期了。然而,大部分的慢性疾病,若在临床期之前发现,就应及早治疗,治疗效果会远比症状显现后才治疗要好,而且康复几率也比较高。假若疾病到临床期才发现,所花费的时间与精力就会相对地增加,而且治愈率较低。

  因此我们做健康检查的目的就是趁着疾病潜在人体中尚未有症状时,通过早期检查,做到早期发现,早期治疗。只有这样才能增加医疗效果,减少疾病继续恶化,保证身体的健康。总而言之,做健康检查的目的可归为下列三点:

  (1)早期发现潜在的致病因子,及时有效的治疗。

  (2)观察身体各项功能反应,适时予以调整改善。

  (3)加强对自我身体功能的了解,改变不良的生活习惯,避免危险因子的产生,提高健康水平

  我们说说的“定期”,就是要每隔一定的时间体检一次,其长短可视不同情况而有所不同。年轻人可以一年查一次,而中老年人最好半年体检一次。当然,定期体检要因人而异,根据检查追踪的项目而定。定期体检还有一项好处,就是可以建立自己的“参考值”,作为推断自己身体健康状况的参考,从测定数值的变化中能了解更多的东西。因此,每年的定期体检不可或缺。

  基因图谱的研究预测人们寿命将会更长。不过,根据目前的条件来看,我们如何才能活得更长寿呢?答案就是:1、要有良好的环境,健康的饮食和生活方式等,尽量阻止疾病的发生;2、定期体检。有许多病待到有症状时才就医治疗的话,往往为时已晚。例如癌症,待到长得很大有症状才手术切除,往往已有转移而存活不久。但是如果早期发现经过手术切除后复发率就很低。还有一些病如高血压、高血脂、糖尿病等,在早期并无症状,只有靠检查才能发现。而到晚期有症状而且有并发症时,治疗就很棘手。因此,无论如何,及早发现疾病是治疗成功的关键。因此定期体检是必要也是必须的。

  那么定期体检究竟应该从何时开始,间隔几年,做哪些检查呢?根据网上查找的资料,以下意见可以作为参考。

  21岁就要定期测血压。30岁以上定期测血脂。40岁以上定期测血糖。具体来说,有这些病的家族史和这些病的风险因子者就应早开始,隔一、二年查一次。如工作、生活紧张者考虑高血压;体胖、营养过剩者考虑高血脂;年老体胖者考虑糖尿病等。妇女在20~39岁应由专科医生每3年查一次乳房,40岁以上间隔短些,以排除乳腺癌。中年以上生育过妇女应每3年查一次子宫颈刮片,以排除宫颈癌。男性50岁以上应每年检查一次前列腺,包括肛门指检及抽血查前列腺特异抗原(PSA)。因为男性癌症中前列腺癌是名列前茅的。此外,体检中应包括胸部X线透视以排除肺癌,以及抽血测甲胎蛋白及癌胚抗原等以排除肝癌等。必要时作B超检查肝、肾及前列腺等部位。

  另外,美国梅奥医学中心的专家们还为您提供了一个定期健康体检的清单。它一共涉及9个项目。这张清单就会告诉您什么时候应该去做什么检查。

  1、牙齿检查:从一岁起,每年至少做一次牙齿检查。

  2、视力检查:从三岁起,第一次检查视力。以后视情况每3-5年检查一次。

  3、血压检查:在您10岁的时候,应该做第一次血压检查,以后至少每两年做一次。

  4、宫颈涂片检查:如果您是女性,在您18岁的时候(或者性行为以后)做第一次宫颈涂片检查。以后1-3年检查一次。在获得连续三次阴性结果后,检查间隙可以延长。

  5、胆固醇检查:在您20岁的时候,做第一次血胆固醇检查,以后每五年做一次。

  6、乳房检查:如果您是女性,在您40岁的时候,做第一次由医生进行的乳房检查。

  7、前列腺检查:如果您是男性,在您50岁的时候,第一次做前列腺检查。注意有些医生希望您在40岁时就做。

  8、乳房造影检查:如果您是女性,在您50岁的时候,第一次做乳房造影检查。注意有些医生希望您在40岁就做。

  9、直肠镜检查:在您50岁的时候,您开始做第一次直肠镜检查,以后3-5年做一次。

  最后建议:亚裔大肠癌发生率低,但胃癌发生率高,故此项宜改为做胃镜检查为宜。

经常运动究竟能给人带来什么?

  毋庸置疑,科学的运动是对抗衰老,强身健体最有效,最安全的方法。

  科学家通过对长寿老人进行的调查结果表明,长寿老人80%是坚持劳动和体育运动的。现代运动心理学的研究也证明了劳动与运动对保持健康和提高器官生理功能的重要性。适当的劳动和运动可以促进新陈代谢过程,延缓衰老。

  瑞典科学家对3206名65岁以上的老年人做了长达12年的追踪调查,发现每周坚持锻炼可以延年益寿。运动项目包括骑单车和步行运动。如果偶尔锻炼一下,也许可以降低死亡机会,而每周坚持锻炼几次则可降低死亡机会达40%。在俄罗斯鞑靼共和国妇女中开展的“我的年龄就是我的财富”的竞赛中,108岁的阿明娜·哈努姆·希加波娃荣登榜首。希加波娃经常在家里勤恳劳动,锻炼身体。她健康的秘诀是一句话:“谁不运动谁就不会长寿。”

  国外医学家对健康长寿问题,提出六个方面的情况要人们引起重视。

  1、保持神经系统的稳定性,并尽量保持良好情绪。

  2、不断增强心血管系统功能:心血管系统是现代人生命保障体系中最薄弱的一环,增强其功能的有效手段是竞走、跑步、游泳、滑雪、划船和骑自行车。这些活动脊益于心血管系统,对人体的神经、呼吸及其他系统也有积极作用。

  3、保持正常的体重:体重超过正常标准,极易导致各种器官提早衰老。要战胜肥胖症只有两种可靠的办法:一是食物的热量有所限制,但营养成分要充足(宜多食用天然蔬菜和水果,少吃面食与甜食);二是以循环性锻炼(竞走、跑步、游泳、滑雪、骑自行车)为主的积极运动。

  4、加强锻炼,增强身体的抵抗力:身体的抵抗力越强,受疾病的侵害就越少。锻炼的唯一途径,就是经常进行体温调节机制的锻炼(一年四季以轻装为宜,冷疗法、冷热水淋浴等)。

  5、促进呼吸器官日益强健,并抛弃有害健康的习惯:首先是吸烟与喝酒。其目的大都是改善大脑供血系统和其他器官的功能,也可使免疫系统得以增强。

  6、强化骨骼肌肉组织和各关节功能:这一条对所有内脏器官来说都极其重要。甚为发达的骨骼肌肉能使内脏器官的机能加强。要使这些器官经常处于训练状态,其手段是通过体操和按摩来增强双手、背部、腹部、胸部、双腿、脖子等部位肌肉,并有助于改善体态和使关节灵活!

  从以上六条大家都能看出健康与运动息息相关。

  经常运动能给人带来什么呢?

  1、运动促使皮肤健康。运动能增加皮肤的血液循环,促进新陈代谢,提高感觉的灵敏度,加强皮肤如毛孔、汗腺、皮脂腺等对冷热刺激的适应能力,从而增强人体的防御能力及免疫力。

  2、运动可增强心血管系统的功能。爱好运动的人,心肌纤维增粗,心脏收缩力增强,营养心脏的冠状动脉血管管壁弹性增高,从而使心脏的供血得到改善,使心脏功能增强。这样可预防或推迟心血管疾病,如动脉硬化、高血压、冠心病等发生。

  3、运动可改善呼吸系统功能。经常运动,呼吸肌强壮有力,吸气时胸廓充 分扩张,使更多的肺泡张开而收人更多的氧气,呼气时胸廓尽量压缩,排出更多的二氧化碳和废气,通过长期的锻炼,人的呼吸变成深而慢,便呼吸肌得到充分 的休息。呼吸功能好可使人体维持旺盛的精力,从而推迟身体的老化过程。

  4、运动可提高消化系统的功能。人在运动中会增强体内营养物质的消耗, 使整个机体的血液循环加速,新陈代谢旺盛,从而提高食欲,还会促进胃肠蠕动,消化液分泌增加,吸收增加,改善肝脏的功能,从而为中老年人的健康提供良 好的物质保证。

  5、运动改善神经系统的功能。运动时各部分肌肉有规律而协调地收缩,对 神经系统是一个很好的锻炼,使机体灵活,动作迅速,精力充沛,机体保持良好的防御机能。科学家研究证明,经常参加体育锻炼能增强体质,减少疾病,促进 健康,运动可使人体血液畅通,新陈代谢旺盛,使身体的各个器官的互相联系更 加密切而协调,还能使大脑的紧张状态得到缓和,提高大脑的工作效率。

  6、运动可改善骨骼系统的功能。经常运动可使肌纤维变粗而坚韧有力,其 中所含蛋白质及糖元等的储备量增加,血管畅通,血液循环及新陈代谢改善,动作的耐力、速度、灵活性、正确性都增强。肌肉附着于骨骼,经常运动会改善骨 骼的血液循环和代谢,使骨外层的密质增厚,骨质更加坚固,延缓骨质疏松和脱 钙等老化过程,从而提高了骨骼系统抗折断、弯曲、扭转的能力。

  如何通过运动来健康长寿

  健身跑

  健身跑是最常见的一种中老年人的健身锻炼方法。健身跑的保健作用在于使心肺功能得以增强,氧的摄取和血流量得到改善。

  年轻时最好天天锻炼,每次跑步距离在2000—3000米左右。在中年以后改为每周锻炼5次,将跑步的距离加长了些,但强度减小了些;到了60岁以后改为隔日锻炼,每次锻炼跑5000米左右。如果腿感觉不舒服时,就将跑步改为大步长距离走,强度以感觉舒适为准。

  实际上,健身跑的形式不用过分拘泥,可以多采用些如快走、后踢腿跑、扩胸展臂、深呼吸等辅助动作,增加锻炼时的欢乐和兴趣。此外,健身跑时要讲究心理卫生,排除一切杂念,保持愉快心理状态。为了提高锻炼者的兴趣和调节运动量,健身跑主要有以下几种形式:

  走跑交替。这种形式适合初练健身的人。开始时用一般速度走一段距离,再慢跑一段距离,这样走跑交替进行,随着锻炼者体力、耐力的提高,可逐渐缩短走的距离加长跑的距离。

  慢速放松跑。经过走跑交替一段时间的锻炼以后,可采用慢速放松跑。开始时速度不宜快,而且要匀速,呼吸深长细缓,并与脚步配合,有一定的节奏,可两步一吸,两步一呼或三步一吸,三步一呼。跑时摆臂要自然,上体要正直,眼向前看,步伐保持轻快,通体放松。跑的路线、距离和时间要固定,随着体力、耐力的提高可适当增加。

  变速跑。这种方法适合已经有一定基础的健身跑锻炼者。变速跑是慢跑和中速跑交替进行。慢跑主要是调整体力和呼吸,中速跑是适当加大运动强度。这种方法能提高锻炼者的兴趣和增强其体力和耐力。随着锻炼效果的提高,可适当缩短慢跑距离,增加中速跑的距离。

  限定跑。分为三种,一种是不限跑的速度和距离,只规定跑的时间,如20分钟、30分钟、1小时定时跑。一种是只规定一次跑的距离,如3000米、5000米。还有一种是既规定时间又规定距离,如用30分钟跑完5000米。这种方法可提高体力和耐力,培养意志,但要求较高。

  原地跑。这种方法一般多在因气候因素不能在室外进行时采用,即在原地跑步,为了提高运动强度和兴趣,可增加动作幅度和难度,如原地小步跑,原地抬腿跑,原地踢腿跑,也可采用一定时间计数跑,如1分钟可以一共跑多少步等等。

  需要注意的是,对于中老年人来说,虽然健身跑有益健康,但必须科学、适量,从自身身体状况出发。即使对于那些健康的中老年人朋友们来说,也要注意在参加大运动负荷的活动或比赛之前,都必须经过两三个月以上时间的专门准备并且进行医务监督,以保证安全;之后还要十分注意休息,只有完全恢复体力后方开始正式锻炼。

  散步

  散步能健身治病、益寿延年,已被科学实践证实。美国盐湖城老年人健康中心曾做过一项实验,让部分55—70岁老人每周3次、每次散步一小时。持续4个月后,老人与整天坐着不动的人相比身体反应的速度加快、视力提高、心脏功能增强、原有的病痛减轻,甚至还增强了记忆。另一所美国圣路易斯州的华盛顿大学,也做了一项实验,让患有骨质疏松妇女服用适量的钙片,配合每周3次,每次一小时的散步。持续22个月,脊椎骨密质增加6%,她们的身体骨质更加结实了。

  但对于中老年人而言,要得到更好的效果,还得根据个人不同的情况对环境加以选择。如心情不畅的人,应选择到鸟语花香的公园散步,以借景消郁;心火较重,心情烦躁者,宜到海边或森林密布的地方散步,以吸收阴凉的空气,滋润心神;患有风湿性关节炎或水肿病的人,则应到沙地干燥处散步,以燥湿消肿。对季节、气候的选择,如春天宜在早晨到野外散步,以吸收万物之生气,焕发机体阴阳滋生;夏天宜在鸡鸣起床,到荷塘柳河边散步,以取凉润之气而防暑;秋天宜在金色晚霞散步,以收敛大地之精气而备冬;冬天宜在走廊、室内散步,以活跃阳气,抵御风寒。还有一种新兴时尚是在霏霏细雨中散步,经科学研究认为:毛毛细雨不仅能净化污染日趋严重的城市空气,而且在雨前残阳中产生的大量负离子还具有安神舒气、降低血压的功能。

  游泳

  游泳是一种很好的健身运动项目,游泳的有益健康和强健体魄的作用,主要是由于在游泳时,水对胸廓有很大的压力,呼吸肌必须额外地克服此种阻力才能正常呼吸。因此,经常游泳可增加肺活量,促进呼吸系统功能;游泳时,水会对人体皮肤和血管赋予压、打、拍击的“按摩”作用,并且游泳时全身的关节肌肉都能得到锻炼,从而促进血液循环,加强心脏的功能。此外,游泳池的水温一般低于体温,对皮肤的寒冷刺激可增强机体对气温变化的适应能力,所以游泳还可以预防感冒和呼吸道疾病,例如扁桃体炎、支气管炎、肺炎等。

  但是老年人的体质毕竟比较弱,全身的器官组织有不同程度的衰退,还经常伴有多种慢性病,因此最好能经过医生的允许。游泳时必须注意的是游泳池的水温不能太低,太冷的水会使血管急剧收缩,血压会突然升高,严重时有可能导致心脏病或脑中风等意外;入水前一定要做好准备活动,如做徒手操、体操、慢跑等活动,使身体发热,微微出汗后再入水;游泳入水不要过猛,动作要缓慢,距离不要过长,以免发生头晕、恶心、呕吐等不良反应