【名稱】:Windows Server 2008 安装指南 【作者】:--- 【大小】:2.54MB 【格式】:PPT 【語言】:簡體中文 【內容簡介】: Windows Server 2008 是专为强化下一代网络、应用程序和 Web 服务的功能而设计,是有史以来最先进的 Windows Server 操作系统。拥有 Windows Server 2008,您即可在企业中开发、提供和管理丰富的用户体验及应用程序,提供高度安全的网络基础架构,提高和增加技术效率与价值。 Windows Server 2008 虽是建立在 Windows Server 先前版本的成功与优势上,不过,Windows Server 2008 已针对基本操作系统进行改善,以提供更具价值的新功能及更进一步的改进。新的 Web 工具、虚拟化技术、安全性的强化以及管理公用程序,不仅可帮助您节省时间、降低成本,并可为IT基础架构提供稳固的基础。 1. WindowsServer2008优点介绍; 2. 系统和硬件设备要求 3. 安装方式 4. 安装前的注意事项 5. 安装WindowsServer2008 6. 排除故障 【下載載點】: http://www.400gb.com/file/68284103
转自: http://xxinside.blogbus.com/logs/47162540.html 什么是Mutex “mutex”是术语“互相排斥( mut ually ex clusive)”的简写形式,也就是互斥量。互斥量跟临界区中提到的Monitor很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂,因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。.Net中mutex由Mutex类来表示。 先绕一小段路 在开始弄明白Mutex如何使用之前,我们要绕一小段路再回来。 读书的时候,大家接触互斥量、信号量这些玩意儿应该是在《操作系统》这一科。所以,其实这些玩意儿出现的原由是作为OS功能而存在。来看看Mutex的声明: public sealed class Mutex : WaitHandle 类上有个属性:ComVisibleAttribute(true),表明该类成员对COM成员公开。不去管它,只要知道这玩意儿跟COM有关系了,那大概跟Windows关系比较密了; Mutex它有个父类:WaitHandle 于是我们不得不再走远一些,看看WaitHandel的声明: public abstract class WaitHandle : MarshalByRefObject, IDisposable WaitHandle实现了一个接口,又继承了一个父类。IDisposable在 C#线程同步(2)- 临界区&Monitor关于Using的题外话 中已简单提到,这里就不再多说了。看看它的父类 MarshalByRefObject : MarshalByRefObject 类 允许在支持远程处理的应用程序中跨应用程序域边界访问对象。 …… 备注 : 应用程序域是一个操作系统进程中一个或多个应用程序所驻留的分区。同一应用程序域中的对象直接通信。不同应用程序域中的对象的通信方式有两种:一种是跨应用程序域边界传输对象副本,一种是 使用代理交换消息。 MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。…… 好啦,剩下的内容不用再看,否则就绕得太远了。我们现在知道Mutex是WaitHandle的子类(偷偷地告诉你,以后要提到的EventWaitHandle、信号量Semaphore也是,而AutoResetEvent和ManualResetEvent则是它的孙子),而WaitHandle又继承自具有在操作系统中跨越应用程序域边界能力的MarshalByRefObject类。所以我们现在可以得到一些结论: Mutex是封装了Win32 API的类,它将比较直接地调用操作系统“对应”部分功能;而Monitor并没有继承自任何父类,相对来说是.Net自己“原生”的(当然.Net最终还是要靠运行时调用操作系统的各种API)。相较于Monitor,你可以把Mutex近似看作是一个关于Win32互斥量API的壳子。 Mutex是可以跨应用程序/应用程序域,因此可以被用于应用程序域/应用程序间的通信和互斥;Monitor就我们到目前为止所见,只能在应用程序内部的线程之间通信。其实,如果用于锁的对象派生自MarshalByRefObject,Monitor 也可在多个应用程序域中提供锁定。 Mutex由于需要调用操作系统资源,因此执行的开销比Monitor大得多,所以如果仅仅需要在应用程序内部的线程间同步操作,Monitor/lock应当是首选。 有点象Monitor?不如当它是lock。 好了,终于绕回来了。来看看怎么使用 Mutex 。 WaitOne() / WaitOne(Int32, Boolean) / WaitOne(TimeSpan, Boolean) :请求所有权,该调用会一直阻塞到当前 mutex 收到信号,或直至达到可选的超时间隔。这几个方法除了不需要提供锁定对象作为参数外,看起来与Monitor上的Wait()方法及其重载很相似相似。不过千万不要误会, WaitOne()本质上跟Monitor.Enter()/TryEnter()等效,而不是Monitor.Wait()! 这是因为这个WaitOne()并没有办法在获取控制权以后象Monitor.Wait()释放当前Mutex,然后阻塞自己。 ReleaseMutex() :释放当前 Mutex 一次。注意,这里强调了一次,因为拥有互斥体的线程可以在重复的调用Wait系列函数而不会阻止其执行;这个跟Monitor的Enter()/Exit()可以在获取对象锁后可以被重复调用一样。Mutex被调用的次数由公共语言运行库(CLR)保存,每WaitOne()一次计数+1,每ReleaseMutex()一次计数-1,只要这个计数不为0,其它Mutex的等待者就会认为这个Mutex没有被释放,也就没有办法获得该Mutex。 另外,跟Monitor.Exit()一样,只有Mutex的拥有者才能RleaseMutex(),否则会引发异常。 如果线程在拥有互斥体时终止,我们称此互斥体被遗弃(Abandoned)。在MSDN里,微软以警告的方式指出这属于“严重的”编程错误。这是说拥有mutex的拥有者在获得所有权后,WaitOne()和RelaseMutex()的次数不对等,调用者自身又不负责任地中止,造成mutex 正在保护的资源可能会处于不一致的状态。其实,这无非就是提醒你 记得在try/finally结构中使用Mutex 。 回想我们在《C#线程同步(2)- 临界区&Monitor》中提到的关于 生产者和消费者的场景 ,由于这两个函数不等效于Monitor的Wait()和Pulse(),所以仅靠这ReleaseMutex()和WaitOne()两个方法Mutex还无法适用于我们那个例子。 当然Mutext上还“算有”其它一些用于同步通知的方法,但它们都是其父类WaitHandle上的静态方法。因此它们并不是为Mutex特意“度身订做”的,与Mutex使用的方式有些不搭调(你可以尝试下用Mutex替换Monitor实现我们之前的场景看看),或者说Mutex其实是有些不情愿的拥有这些方法。我们会在下一篇关于EventWaitHandle的Blog中再深入一些地讨论Mutex和通知的问题。这里暂且让我们放一放,直接借用MSDN上的示例来简单说明Mutex的最简单的应用场景吧: // This example shows how a Mutex is used to synchronize access // to a protected resource. Unlike Monitor, Mutex can be used with // WaitHandle.WaitAll and WaitAny, and can be passed across // AppDomain boundaries. using System; using System.Threading; class Test { // Create a new Mutex. The creating thread does not own the // Mutex. private static Mutex mut = new Mutex(); private const int numIterations = 1; private const int numThreads = 3; static void Main() { // Create the threads that will use the protected resource. for ( int i = 0; i numThreads; i++) { Thread myThread = new Thread( new ThreadStart(MyThreadProc)); myThread.Name = String.Format( "Thread{0}" , i + 1); myThread.Start(); } // The main thread exits, but the application continues to // run until all foreground threads have exited. } private static void MyThreadProc() { for ( int i = 0; i numIterations; i++) { UseResource(); } } // This method represents a resource that must be synchronized // so that only one thread at a time can enter. private static void UseResource() { // Wait until it is safe to enter. mut.WaitOne(); Console.WriteLine( "{0} has entered the protected area" , Thread.CurrentThread.Name); // Place code to access non-reentrant resources here. // Simulate some work. Thread.Sleep(500); Console.WriteLine( "{0} is leaving the protected area\r\n" , Thread.CurrentThread.Name); // Release the Mutex. mut.ReleaseMutex(); } } 虽然这只是一个示意性的实例,但是我仍然不得不因为这个示例中没有使用try/finally来保证ReleaseMutex的执行而表示对微软的鄙视。对于一个初学的人来说,第一个看到的例子可能会永远影响这个人使用的习惯,所以是否在简单示意的同时,也能“简单地”给大家show一段足够规范的代码?更何况有相当部分的人都是直接copy sample code……一边告诫所有人Abandoned Mutexes的危害,一边又给出一段一个异常就可以轻易引发这种错误的sample,MSDN不可细看。 我不得不说Mutex的作用于其说象Monitor不如说象lock,因为它只有等效于Monitro.Enter()/Exit()的作用,不同之处在于Mutex请求的锁就是它自己。正因为如此,Mutex是可以也是必须(否则哪来的锁?)被实例化的,而不象Monitor是个Static类,不能有自己的实例。 全局和局部的Mutex 如果在一个应用程序域内使用Mutex,当然不如直接使用Monitor/lock更为合适,因为前面已经提到Mutex需要更大的开销而执行较慢。不过Mutex毕竟不是Monitor/lock,它生来应用的场景就应该是用于进程间同步的。 除了在上面示例代码中没有参数的构造函数外,Mutex还可以被其它的构造函数所创建: Mutex() :用无参数的构造函数得到的Mutex没有任何名称,而进程间无法通过变量的形式共享数据,所以没有名称的Mutex也叫做 局部(Local)Mutex 。另外,这样创建出的Mutex,创建者对这个实例并没有拥有权,仍然需要调用WaitOne()去请求所有权。 Mutex(Boolean initiallyOwned) :与上面的构造函数一样,它只能创建没有名称的局部Mutex,无法用于进程间的同步。Boolean参数用于指定在创建者创建Mutex后,是否立刻获得拥有权,因此Mutex(false)等效于Mutex()。 Mutex(Boolean initiallyOwned, String name) :在这个构造函数里我们除了能指定是否在创建后获得初始拥有权外,还可以为这个Mutex取一个名字。只有这种命名的Mutex才可以被其它应用程序域中的程序所使用,因此这种Mutex也叫做 全局(Global)Mutex 。如果String为null或者空字符串,那么这等同于创建一个未命名的Mutex。因为可能有其他程序先于你创建了同名的Mutex,因此返回的Mutex实例可能只是指向了同名的Mutex而已。但是,这个构造函数并没有任何机制告诉我们这个情况。因此,如果要创建一个命名的Mutex,并且期望知道这个Mutex是否由你创建,最好使用下面两个构造函数中的任意一个。最后,请注意 name是大小写敏感 的。 Mutex(Boolean initiallyOwned, String name, out Boolean createdNew) :头两个参数与上面的构造函数相同,第三个out参数用于表明是否获得了初始的拥有权。这个构造函数应该是我们在实际中使用较多的。 Mutex(Boolean initiallyOwned, String name, out Booldan createdNew, MutexSecurity) :多出来的这个MutexSecurity参数,也是由于全局Mutex的特性所决定的。因为可以在操作系统范围内被访问,因此它引发了关于访问权的安全问题,比如哪个Windows账户运行的程序可以访问这个Mutex,是否可以修改这个Mutext等等。关于Mutex安全性的问题,这里并不打算仔细介绍了,看看 这里 应该很容易明白。 另外,Mutex还有两个重载的 OpenExisting() 方法可以打开已经存在的Mutex。 Mutex的用途 如前所述,Mutex并不适合于有相互消息通知的同步;另一方面而我们也多次提到局部Mutex应该被Monitor/lock所取代;而跨应用程序的、相互消息通知的同步由将在后面讲到的EventWaiteHandle/AutoResetEvent/ManualResetEvent承担更合适。所以,Mutex在.net中应用的场景似乎不多。不过,Mutex有个最常见的用途:用于控制一个应用程序只能有一个实例运行。 using System; using System.Threading; class MutexSample { private static Mutex mutex = null; //设为Static成员,是为了在整个程序生命周期内持有Mutex static void Main() { bool firstInstance; mutex = new Mutex(true, @"Global\MutexSampleApp", out firstInstance); try { if (!firstInstance) { Console.WriteLine ("已有实例运行,输入回车退出……"); Console.ReadLine(); return; } else { Console.WriteLine ("我们是第一个实例!"); for (int i=60; i 0; --i) { Console.WriteLine (i); Thread.Sleep(1000); } } } finally { //只有第一个实例获得控制权,因此只有在这种情况下才需要ReleaseMutex,否则会引发异常。 if (firstInstance) { mutex.ReleaseMutex(); } mutex.Close(); mutex = null; } } } 这是一个控制台程序,你可以在编译后尝试一次运行多个程序,结果当然总是只有一个程序在倒数计时。你可能会在互联网上找到其它实现应用程序单例的方法,比如利用 Process 查找进程名、利用Win32 API findwindow 查找窗体的方式等等,不过这些方法都不能保证绝对的单例。因为多进程和多线程是一样的,由于CPU时间片随机分配的原因,可能出现多个进程同时检查到没有其它实例运行的状况。这点在CPU比较繁忙的情况下容易出现,现实的例子比如傲游浏览器。即便你设置了只允许一个实例运行,当系统比较忙的时候,只要你尝试多次打开浏览器,那就有可能“幸运”的打开若干独立的浏览器窗口。 别忘了,要实现应用程序的单例,需要在在整个应用程序运行过程中都保持Mutex,而不只是在程序初始阶段。所以,例子中Mutex的建立和销毁代码包裹了整个Main()函数。 使用Mutex需要注意的两个细节 可能你已经注意到了,例子中在给Mutex命名的字符串里给出了一个“Global\”的前缀。这是因为在运行终端服务(或者远程桌面)的服务器上,已命名的全局 mutex 有两种可见性。如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见。如果名称以前缀“Local\”开头,则 mutex 仅在创建它的终端服务器会话中可见,在这种情况下,服务器上各个其他终端服务器会话中都可以拥有一个名称相同的独立 mutex。如果创建已命名 mutex 时不指定前缀,则它将采用前缀“Local\”。在终端服务器会话中,只是名称前缀不同的两个 mutex 是独立的 mutex,这两个 mutex 对于终端服务器会话中的所有进程均为可见。即:前缀名称“Global\”和“Local\”仅用来说明 mutex 名称相对于终端服务器会话(而并非相对于进程)的范围。最后需要注意“Global\”和“Local\”是大小写敏感的。 既然父类实现了IDisposalble接口,那么说明这个类一定需要你手工释放那些非托管的资源。所以必须使用try/finally,亦或我讨厌的using,调用 Close() 方法来释放Mutex所占用的所有资源! 题外话: 很奇怪,Mutex的父类WaitHandle实现了IDisposable,但是我们在Mutex上却找不到Dispose()方法,由于这个原因上面代码的finally中我们用的是Close()来释放Mutex所占用的资源。其实,这里的Close()就等效于Dispose(),可这是为什么? 再去看看WaitHandle,我们发现它实现的Disopose()方法是protected的,因此我们没有办法直接调用它。而它公开了一个Close()方法给调用者们用于替代Dispose(),因此Mutex上也就只有Close()。可这又是为什么? 话说.Net最初的设计师是微软从Borland公司挖过来的,也就是Delphi之父。熟悉Delphi的人都知道,Object Pascal构架中用于释放资源的方法就是Dispose(),所以Dispose()也成为.Net构架中的重要的一员。 不过从语义上来讲,对于文件、网络连接之类的资源“Close”比“Dispose”更符合我们的习惯。因此“体贴”的微软为了让用户(也就是我们这些写代码的人)更“舒服”,在这种语义上更适合用Close的资源上,总是提供Close()作为Disopose()的公共实现。其实Close()内部不过是直接调用Dispose()而已。对于这种做法,我在感动之余实在觉得有些多余了,到底要把一个东西搞得多么千变万化才肯罢休? 如果你实在喜欢Dispose(),那么可以用向上转型 ((IDisposable)((WaitHandle)mutex)).Dispose()把它找出来。即强制把mutex转换为WaitHandle,然后再把WaitHandle强制转型为IDisposable,而IDisposable上的Dispose()是public的。不过我们终究并不确定Mutex以及WaitHandle的Close()中到底是不是在override的时候加入了什么逻辑,所以还是老老实实用Close()好了~
Apes With Apps Using tablets and customized keyboards, bonobos can become great communicators By Ken Schweller/July 2012 Share on print Share on email Share on facebook Share on twitter Share on stumbleupon Share on google_plusone Share on reddit More Sharing Services 17 Page 1 2 3 4 5 // View All Photo: Gregg Segal Can we talk? Kanzi, a 31-year-old bonobo, can converse with humans by selecting “lexigram” symbols on his Motorola Xoom tablet. Have you ever watched a toddler play with an iPhone? Most likely, the child was completely captivated and surprisingly adept at manipulating the tiny icons. Two-year-old Teco is no different. Sitting with his Motorola Xoom tablet, he’s rapt, his dark eyes fixed on the images, fingers pecking away at the touch screen. He can’t speak, but with the aid of the tablet app I created for him, he’s building a vocabulary that will likely total several thousand words. What’s more, he’ll be able to string those words together into simple sentences and ask questions, tell jokes, and carry on conversations. Such talents wouldn’t seem exceptional in a human child, but Teco is an ape— a bonobo, to be precise . To the uninitiated, bonobos look very much like chimpanzees , but they are in fact a separate species with distinct physical and behavioral traits. More collaborative and sociable than their chimp cousins, bonobos also seem to be more adept at learning human language. And they are endangered, found in the wild only in the Democratic Republic of the Congo . Recent estimates put the wild bonobo population at between 10 000 and 50 000. Fewer than 150 live in captivity. Along with the chimpanzee, they are our species’ closest relatives. For more than three decades, researchers have been working with a small group of bonobos, including Teco, to explore their amazing cognitive and linguistic abilities. Teco’s father, Kanzi, is the group’s most famous member : Anderson Cooper has interviewed him, and he’s played piano with Paul McCartney and Peter Gabriel. Animal lovers worldwide have marveled at his ability to communicate by pointing to abstract symbols. He recognizes nearly 500 of these “lexigrams,” which he uses to make requests, answer questions, and compose short sentences. The spoken words he understands number in the thousands. Even so, many people question these abilities. Indeed, for more than a century scientists have debated whether apes could ever truly comprehend human language. Many researchers argue that language is the exclusive domain of humans, and several influential studies in the 1980s concluded that supposedly “talking” apes were merely demonstrating their capacity for imitation, with lots of unintentional cuing by the animals’ handlers. Linguist Noam Chomsky has likewise argued that the human brain contains a species-specific “ language acquisition device ,” which allows humans, and only humans, to acquire language. But the bonobo research I’ve been involved with, led by primatologist Sue Savage-Rumbaugh at the Bonobo Hope Great Ape Trust Sanctuary , in Des Moines, strongly suggests otherwise. Today, the wide availability of touch screens, tablet computers, digital recording, and wireless networking is giving researchers the world over powerful new ways to study and unambiguously document ape communication. The results of these studies are in turn helping to spark a renaissance of technology-aided research into primate development and cognition and shedding light on the origins of culture, language, tools, and intelligence. Source: http://spectrum.ieee.org/computing/software/apes-with-apps/?utm_source=techalertutm_medium=emailutm_campaign=070512
移动办公估计是一个发展趋势, Elsevier 刚才发邮件征集能够帮助作者在移动中也可以投稿的应用程序创意。世界是运动的,物质是运动的,运动是绝对的。未来科学家一有灵感和想法甚至可以在手机上迅速写出论文,进而快速的投稿和发表。看来,广大科研工作者不仅可以在博客、 Facebook 和 Google 上 发表自己的想法,也可以在办公室之外的空间正儿八经的发表在主流期刊上。 Elsevier 只是想让广大科研工作者参与和提出这样的应用程序可能是什么样子的,不知科网的网友可否描述一下未来的愿景?他们的问题: 1. What does your application do? 2. What issues will your application solve? 3. How will your application solve these issues? 4. Describe your ideas for the visual layout of the application on the mobile device: 5. Is the application intuitive and easy to use i.e. requiring no learning curve for the user? Please explain your reasoning below: 6. Lastly, we would be delighted to receive your feedback about any publishing-based iPad applications you have used on a personal or professional basis. Please let us know the name of the iPad application and tell us why you like it! 链接: http://www.elsevierauthormobileapp.com/
http://blog.csdn.net/yishengxiao/archive/2008/07/28/2723312.aspx 磨练 构建正则表达式模式的技能 通过本文的学习,您可以增加一些有用的设计实际正则表达式 (regexp) 的技能。构建正则表达式是任何管理员日常工作中的一部分。为了构造返回所需条件的成功正则表达式,需要学习以模式匹配的角度进行思考,而这种技能需要花大量的时间进行练习。 引言 UNIX 管理员每天都需要构建和使用正则表达式 (regexp) 进行文本模式匹配。大多数语言都支持正则表达式的某种实现。有的应用程序(如 EMACS)具有正则表达式搜索功能,并且您可以通过各种命令行工具使用正则表达式。无论什么应用程序,构建正确的正则表达式的关键之处在于,识别仅满足需要匹配的数据的模式,以便在输入中排除其他不必要的内容。 出于这个目的,本文将逐步介绍几种正则表达式模式构建技巧,并介绍它们如何帮助您完成各种常规任务。 使用正则表达式 (regexp) 除非特别说明,否则本文中使用的示例都是扩展可移植操作系统接口(扩展 POSIX)的正则表达式。如果通过命令行(如使用 egrep 实用工具)使用它们,您应该根据需要引用各种正则表达式。请记住,不同的正则表达式实现之间存在一些区别,您可能不得不适应所使用的特定的工具、应用程序或语言中的具体实现。 匹配整行内容 ^ 元字符匹配行首,而 $ 匹配行尾,如果将它们组合在一起(如 ^$),它们将匹配空行。(这个表达式的镜像,即 $^,是不可能匹配成功的,它将永远 都无法匹配到有效行。)这个基本的正则表达式是许多复杂正则表达式的基础,如果您还不习惯使用这个基本的正则表达式,那么您应该逐步养成使用它的习惯。使用它来构建匹配整行内容 的模式。 在用户字典文件 (/usr/dict/words) 中搜索是一个很好的基本模式。(有些版本的 UNIX 将用户字典放在 /usr/share/dict/words 中。) 例如,假设您忘记了如何拼写单词 fuchsia。其中是否包含 sh 或 cs 呢?您所知道的只是,它以 fu 开头并以 ia 结尾。 尝试使用这个模式进行搜索: $ egrep -i '^fu.*ia$' /usr/dict/words -i 标志表示在搜索过程中不区分大小写。在这个示例中,因为 fuchsia 拼写正确,所以在返回的单词中包括这个单词。 根据长度匹配行 使用大括号元字符 ({ }) 指定前面的正则表达式匹配多少次,如表 1 所示。当您将它们添加到刚才介绍的整行搜索中时,您可以指定行的长度。 表 1. 大括号元字符的含义 示例 描述 {X} 这个字符对前面的正则表达式匹配 X 次。 {X,} 这个字符对前面的正则表达式匹配 X 或更多 次。 {X,Y} 这个字符对前面的正则表达式匹配至少 X 而不超过 Y 次。 并不是所有扩展正则表达式的实现都支持大括号。此外,根据具体的实现,您可能需要先使用反斜杠对其进行转义。 您可以使用这个正则表达式得到字典中以单词长度为顺序的报告。所获得结果的数目取决于本地系统的字典文件中单词的数目,然而,它应该与清单 1 所示类似。在这个示例中,最常见的单词长度是 9 个字母,该字典中有 32,380 个匹配单词。该字典中不包括 25 个字母或更长的单词,并且最长的单词并不是您认为的 21 个字母长的 disestablishmentarian(有 81 个同样长度的单词,包括 superincomprehensible 和 phoneticohieroglyphic),这个 UNIX 字典中最长的单词有 5 个,包括 pathologicopsychological。 清单 1. 计算字典中 X 个字母的单词的个数 $ for i in `seq 1 32` { echo "There are" `egrep '^.{'$i'}$' /usr/dict/words \ | wc -l` "$i-letter words in the dictionary." } There are 52 1-letter words in the dictionary. There are 155 2-letter words in the dictionary. There are 1351 3-letter words in the dictionary. There are 5110 4-letter words in the dictionary. There are 9987 5-letter words in the dictionary. There are 17477 6-letter words in the dictionary. There are 23734 7-letter words in the dictionary. There are 29926 8-letter words in the dictionary. There are 32380 9-letter words in the dictionary. There are 30867 10-letter words in the dictionary. There are 26011 11-letter words in the dictionary. There are 20460 12-letter words in the dictionary. There are 14938 13-letter words in the dictionary. There are 9762 14-letter words in the dictionary. There are 5924 15-letter words in the dictionary. There are 3377 16-letter words in the dictionary. There are 1813 17-letter words in the dictionary. There are 842 18-letter words in the dictionary. There are 428 19-letter words in the dictionary. There are 198 20-letter words in the dictionary. There are 82 21-letter words in the dictionary. There are 41 22-letter words in the dictionary. There are 17 23-letter words in the dictionary. There are 5 24-letter words in the dictionary. There are 0 25-letter words in the dictionary. There are 0 26-letter words in the dictionary. There are 0 27-letter words in the dictionary. There are 0 28-letter words in the dictionary. There are 0 29-letter words in the dictionary. There are 0 30-letter words in the dictionary. There are 0 31-letter words in the dictionary. There are 0 32-letter words in the dictionary. $ 匹配单词 围绕字符 \ 和 \ 是非常有用的模式构造器:它们将要匹配的整个单词 括起来,这表示,它们不会匹配带括号的模式,除非该模式本身就是一个单词。单词 定义为两侧由非单词字符描述的、任意数目组成单词的字符(数字、字母和下划线字符)。非单词字符包括下面的所有字符: •行首 •空白字符 •标点符号 •行尾 •任何除字母、数字或下划线以外的字符 这些围绕字符可以节省大量的时间,但是它们常常没有被充分地利用,可能是因为并非所有的正则表达式实现都支持它们。如果您的正则表达式实现支持它们,那么您应该逐步养成使用它们的习惯。 将需要单独匹配的单词括起来,如下所示: \system\ 这个示例中的正则表达式不会匹配单词 ecosystem、systemic 或 system/70,也不会匹配模式 system 出现在行中任意位置的那些行,它将仅仅 匹配 system 作为独立的单词出现的那些行。 围绕字符与圆括号中的分组结合在一起,可以用来匹配部分 单词。 要匹配包含以 pre 开头 的单词的那些行,可以使用: \\(pre\).*\ 前面的示例将匹配包含单词 preface 和 preposterous 的行,但不会匹配 spread 或 Dupre。 匹配重复单词 这里介绍一种使用单词围绕字符匹配重复单词的快速方法,重复单词表示一个单词在空格之后再次出现。您还可以使用逆向引用,这是大多数流行的正则表达式实现中的一种递归特性,它可以匹配模式本身的某一部分。(将模式中需要引用的部分使用圆括号括起来,然后使用反斜杠加上需要进行引用的围绕字符编号来调用逆向引用:1 表示第一个圆括号分组,2 表示第二个圆括号分组,依此类推。) 要查找重复的单词,搜索在任意数目的空格之后再次出现该单词的情况,可以通过对第一个使用圆括号的部分进行逆向引用来实现: (\.*\)( )+\1 这个示例匹配缩写形式和任何类型的单词,但是它不会匹配由标点符号分隔的重复单词,如 It's been a long, long time。 要匹配所有的重复单词,包括由空格和 任意标点符号分隔的重复单词,可以使用下面的表达式: (\.*\).?( )+\1 如果需要对这些正则表达式使用 grep,则务必使用 -i 标志,以便在搜索中不区分大小写。 匹配小时 让我们再来看另外一类常见的问题:时间和日期。这里介绍了一些设计匹配正确模式的正则表达式所需要考虑的事项。 您无法搜索任何两位的数字来匹配分钟和秒,因为它们仅仅是从 0 到 59,要匹配它们,您需要使用方括号将表示十位和个位的范围括起来: •要匹配标准的 12 或 24 小时格式的小时,可以使用下面的表达式: (( ? )|( )):( )(: )? •要匹配 12 小时 AM/PM 格式、带或不带秒数的时间,甚至匹配大写或小写、不带后缀 AM 或 PM 标识符的时间,可以使用下面的表达式: ( )( ? ){1}(((:( ){1}( ){1}){1,2})|(( )?( M)|( m)))? 如果在上一个示例中没有开始的否定语句,它将匹配不带冒号的时间,这将取决于输入数据,可能会匹配中波广播电台(在美国称为调幅 AM 电台),如 1450 AM。 匹配月份 匹配 12 个月中的任何月份需要一个使用 | 操作符进行分隔的列表,但有时会使用不同的方式对日期进行缩写: •要查找完整拼写或三字母缩写的 12 个月份,可以使用下面的表达式(位于一行): Jan(uary)?|Feb(uary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?| Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)? •您可以加以想象并搜索完整拼写或三字母缩写的变形,即仅当后面紧跟着一个空格或点号的情况,可以使用下面的表达式(位于一行): Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)|Apr(il| |\.)|May( |\.)|Jun(e| |\.)|Jul(y| |\ .)|Aug(ust| |\.)|Sep(tember| |\.)|Oct(ober| |\.)|Nov(ember| |\.)|Dec(ember| |\.) 请注意,在上面的这两个示例中,May 是一个特殊的例外。在所有的月份中,它是唯一的完整拼写与三字母缩写相同的月份,所以成功的匹配必须包含这两种变形中的任何一种 作为其缩写,因此像“Mayflower”这样的单词不会导致误报。 当匹配模式前面的字符不是空格或行首时,这些示例还是会失败(返回误报的结果)。这不太可能会出现在英语散文中,但是可能出现在程序源代码中,因为其中可能使用了像 NumOct 这样的变量名。 要修复这些问题,可以执行下面的操作: •使用圆括号将整个正则表达式括起来,并在它的前面加上另一个限定符,用于匹配行首或者空格字符,如下所示(位于一行): (^| )(Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)|Apr(il| |\.)| May( |\.)|Jun(e| |\.)|Jul(y| |\.)|Aug(ust| |\.)|Sep(tember| | \.)|Oct(ober| |\.)|Nov(ember| |\.)|Dec(ember| |\.)) •另一种完成这个任务的方法是,在该正则表达式的前面加上一个限定符,以匹配非文字数字的字符,如下所示(位于一行): ( )(Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)| Apr(il| |\.)|May( |\.)|Jun(e| |\.)|Jul(y| |\.)|Aug(ust| |\.)| Sep(tember| |\.)|Oct(ober| |\.)|Nov(ember| |\.)|Dec(ember| |\.)) 但是仍然存在潜在的问题,对于搜索整篇英文散文,这些示例并不可靠,因为它们可能返回错误的匹配结果,如“Janelle”或“Augury”这样的单词。要修复这个问题,您必须使用单词围绕字符将每个月份括起来。 本文开头提到,正确的正则表达式应该仅返回需要匹配的数据,以便在输入中排除其他不必要的内容。这种措词是经过仔细考虑的,因为对于构建正则表达式来说,这与上下文有关。对于有些情况,前面的示例非常适合,无需添加额外的单词围绕字符。在其他的情况下,可以对其进行相当程度的简化,例如,如果您正在搜索仅包含大写的日期数值数据的日志文件,那么只需要使用像 这样的正则表达式来匹配包含月份名称的行。 匹配日期 您可以结合一些表 1 所示的数量匹配来匹配日期。 要匹配“month, day, years”,可以使用下面的正则表达式(因为撇号字符是该正则表达式的一部分,所以必须使用双引号将它括起来,如下所示): " {3,10}\.? {1,2}, ( {4}|'? {2})" 这个正则表达式匹配 9 种不同的日期格式: 1.MONTH D, YY 2.MONTH D, 'YY 3.MONTH D, YYYY 4.MON. D, YY 5.MON. D, 'YY 6.MON. D, YYYY 7.MON D, YY 8.MON D, 'YY 9.MON D, YYYY 这个正则表达式的误报包括“Order 99, 99”,要消除这些误报,可以将这个正则表达式与用于月份的正则表达式结合起来,如上所述,以便能够仅匹配实际的月份名称。另外,更改数值范围以避免错误的匹配,并且通过使逗号成为可选项,重复了 18 种可能的格式。 这将得到一个很长的正则表达式。尝试下面的表达式: "( )(Jan(uary| |\.)|Feb(uary| |\.)|Mar(ch| |\.)| Apr(il| |\.)|May( |\.)|Jun(e| |\.)|Jul(y| |\.)|Aug(ust| |\.)| Sep(tember| |\.)|Oct(ober| |\.)|Nov(ember| |\.)| Dec(ember| |\.)) ? {1}(,)? ( {4}|'? {2})" 同样,根据您的需要仔细设计正则表达式。匹配模式通常比较容易,这是因为它存在于特定输入的上下文中,而不是因为它可能独立于数据集而存在。后代人将会发现,前面那个很长的正则表达式中仍然存在 Y10K 错误,因为它能匹配的最大可能的年份为 9999。 匹配整数 正如您在前几个示例中看到的,使用方括号中的范围可以很好地匹配数值。 要匹配任意长度的整数,可以在数值范围后面加上 +;要包括负值,可以在它的前面加上可选的负号(连字号)匹配: -? + 前面的例子可以匹配 0,因为 0 是指定范围中可选的字符。 对于数值匹配,使用圆括号将某些部分括起来也非常有效。要匹配任意的十进制数值,可以使用包含小数点加上一个或多个数值的可选围绕字符,以此对前面的正则表达式进行扩展: -? +(\. +)? 可以使用方括号指定十进制数值的小数位数。例如,要匹配小数位数为 5 或更多小数位数的正数值,可以使用下面的表达式: +\.( ){5,} 更多实际的匹配 范围加上使用括号括起来的元字符,在查找符合任何特定格式的数值时非常有用。将前面介绍的一些技术结合起来,可以构建匹配各种数据的正则表达式: •要匹配美国的电话号码,可以使用: ((\( {2}\))?\ ?| {2}(?:\-?|\ ?)) {2} ? {4} 这个正则表达式可以匹配美国 15 种格式的电话号码: 1.(NPA) PRE-SUFF 2.(NPA) PRE SUFF 3.(NPA) PRESUFF 4.(NPA)PRE-SUFF 5.(NPA)PRE SUFF 6.(NPA)PRESUFF 7.NPA PRE-SUFF 8.NPA PRE SUFF 9.NPA PRESUFF 10.NPAPRE-SUFF 11.NPAPRE SUFF 12.NPAPRESUFF 13.PRE-SUFF 14.PRE SUFF 15.PRESUFF 它还可以匹配美国免费 WATS 号码,尽管 1-800 的“1-”前缀或其他的免费号码不是匹配的一部分,但它本身可以匹配 10 位的数值。对于以 1 或 1+ 开头的美国号码和任意数目的空格,也完全一样,长途电话拨号前缀本身无法匹配,但是只要它后面跟着实际的号码,这个正则表达式就能够将其找出来。 •要匹配两或三位域的电子邮件地址,可以尝试下面的表达式: \ +\@ +?\. {2,3} •要匹配如今所有流行的 URL,可以使用下面的正则表达式: (((http(s)?|ftp|telnet|news)://|mailto:) ]+) 这个表达式可以正常运行,但是匹配 URL 并不像您想象的那么简单。匹配任何可能的 URL 的正则表达式,如 RFC 1738 中的定义,发表在“Regexp for URLs”(请参见参考资料部分)一文中,它非常巨大并且看起来令人生畏。现在应该将它合并为一个 类(如果有用于处理类似数据种类的各种新的类,如 ,那就好了)。 结束语 本文涉及到一些用于编写正则表达式的模式构建技术,以及如何使用它们来完成管理员时常碰到的特定类型数据匹配的工作。在此过程中,向您介绍了大量有价值的实际正则表达式,您可以将它们添加到自己的管理工具库中。 本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/yishengxiao/archive/2008/07/28/2723312.aspx