<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>10V &#187; 正则表达式</title>
	<atom:link href="http://www.smartwei.com/tag/regular-expression/feed" rel="self" type="application/rss+xml" />
	<link>http://www.smartwei.com</link>
	<description>干一行，爱一行</description>
	<lastBuildDate>Fri, 13 Jan 2012 01:22:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>javascript常用正则表达式</title>
		<link>http://www.smartwei.com/javascript-reg.html</link>
		<comments>http://www.smartwei.com/javascript-reg.html#comments</comments>
		<pubDate>Thu, 01 Jul 2010 05:51:35 +0000</pubDate>
		<dc:creator>10V</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://www.smartwei.com/?p=268</guid>
		<description><![CDATA[这篇文章列出了一些常用的javascript正则表达式，希望对大家有用]]></description>
			<content:encoded><![CDATA[<p>正则表达式用于字符串处理，表单验证等场合，实用高效，但用到时总是不太把握，以致往往要上网查一番。这里整理出了一些常用的表达式收藏在这里，作备忘之用。</p>
<p><strong>匹配中文字符的正则表达式：</strong> [\u4e00-\u9fa5]</p>
<p><strong>匹配双字节字符(包括汉字在内)：</strong>[^\x00-\xff]</p>
<p><strong>应用：计算字符串的长度</strong>（一个双字节字符长度计2，ASCII字符计1）</p>
<p>String.prototype.len=function(){return this.replace([^\x00-\xff]/g,”aa”).length;}</p>
<p><strong>匹配空行的正则表达式：</strong>\n[\s| ]*\r</p>
<p><strong>匹配HTML标记的正则表达式：</strong>/&lt;(.*)&gt;.*&lt;\/\1&gt;|&lt;(.*) \/&gt;/</p>
<p><strong>匹配首尾空格的正则表达式：</strong>(^\s*)|(\s*$)</p>
<p>应用：javascript中没有像vbscript那样的<strong>trim函数</strong>，我们就可以利用这个表达式来实现，如下：</p>
<p>String.prototype.trim = function()<br />
{<br />
return this.replace(/(^\s*)|(\s*$)/g, “”);<br />
}</p>
<p><strong>匹配Email地址的正则表达式</strong>：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*</p>
<p><strong>匹配网址URL的正则表达式：</strong>http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?</p>
<p><strong>利用正则表达式去除字串中重复的字符的算法程序：</strong><br />
var s=”abacabefgeeii”<br />
var s1=s.replace(/(.).*\1/g,”$1&#8243;)<br />
var re=new RegExp(“["+s1+"]“,”g”)<br />
var s2=s.replace(re,”")<br />
alert(s1+s2) //结果为：abcefgi<br />
思路是使用后向引用取出包括重复的字符，再以重复的字符建立第二个表达式，取到不重复的字符，两者串连。这个方法对于字符顺序有要求的字符串可能不适用。</p>
<p><strong>得用正则表达式从URL地址中提取文件名的javascript程序</strong>，如下结果为page1<br />
s=”http://www.gzcynet/page1.htm”<br />
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,”$2&#8243;)<br />
alert(s)</p>
<p><strong>用正则表达式限制只能输入中文：</strong>onkeyup=”value=value.replace(/[^\u4E00-\u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^\u4E00-\u9FA5]/g,”))”</p>
<p><strong>用正则表达式限制只能输入全角字符：</strong> onkeyup=”value=value.replace(/[^\uFF00-\uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^\uFF00-\uFFFF]/g,”))”<br />
<strong><br />
用正则表达式限制只能输入数字：</strong>onkeyup=”value=value.replace(/[^\d]/g,”) “onbeforepaste=”clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^\d]/g,”))”</p>
<p><strong>用正则表达式限制只能输入数字和英文：</strong>onkeyup=”value=value.replace(/[\W]/g,”) “onbeforepaste=”clipboardData.setData(&#8216;text&#8217;,clipboardData.getData(&#8216;text&#8217;).replace(/[^\d]/g,”))”</p>
<p>作者: <a href="http://www.smartwei.com">石巍</a><br />
版权所有，转载时必须以超链接形式注明作者和原始出处及本声明。</p>
<p>本文链接: <a href="http://www.smartwei.com/javascript-reg.html">http://www.smartwei.com/javascript-reg.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.smartwei.com/javascript-reg.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何写出高效率的正则表达式</title>
		<link>http://www.smartwei.com/regex-optimizing.html</link>
		<comments>http://www.smartwei.com/regex-optimizing.html#comments</comments>
		<pubDate>Mon, 21 Dec 2009 11:15:22 +0000</pubDate>
		<dc:creator>10V</dc:creator>
				<category><![CDATA[php知识]]></category>
		<category><![CDATA[正则表达式]]></category>

		<guid isPermaLink="false">http://www.smartwei.com/?p=62</guid>
		<description><![CDATA[本文转自我爱正则表达式 &#8211; 一个关于正则表达式的博客，作者对正则表达式很有研究，感兴趣的朋友可以去访问一下。 &#8212;分割线&#8212; 如果纯粹是为了挑战自己的正则水平，用来实现一些特效（例如使用正则表达式计算质数、解线性方程），效率不是问题；如果所写的正则表达式只是为了满足一两次、几十次的运行，优化与否区别也不太大。但是，如果所写的正则表达式会百万次、千万次地运行，效率就是很大的问题了。我这里总结了几条提升正则表达式运行效率的经验（工作中学到的，看书学来的，自己的体会），贴在这里。如果您有其它的经验而这里没有提及，欢迎赐教。 为行文方便，先定义两个概念。 误匹配：指正则表达式所匹配的内容范围超出了所需要范围，有些文本明明不符合要求，但是被所写的正则式“击中了”。例如，如果使用\d{11}来匹配11位的手机号，\d{11}不单能匹配正确的手机号，它还会匹配98765432100这样的明显不是手机号的字符串。我们把这样的匹配称之为误匹配。 漏匹配：指正则表达式所匹配的内容所规定的范围太狭窄，有些文本确实是所需要的，但是所写的正则没有将这种情况囊括在内。例如，使用\d{18}来匹配18位的身份证号码，就会漏掉结尾是字母X的情况。 写出一条正则表达式，既可能只出现误匹配（条件写得极宽松，其范围大于目标文本），也可能只出现漏匹配（只描述了目标文本中多种情况种的一种），还可能既有误匹配又有漏匹配。例如，使用\w+\.com来匹配.com结尾的域名，既会误匹配abc_.com这样的字串（合法的域名中不含下划线，\w包含了下划线这种情况），又会漏掉ab-c.com这样的域名（合法域名中可以含中划线，但是\w不匹配中划线）。 精准的正则表达式意味着既无误匹配且无漏匹配。当然，现实中存在这样的情况：只能看到有限数量的文本，根据这些文本写规则，但是这些规则将会用到海量的文本中。这种情况下，尽可能地（如果不是完全地）消除误匹配以及漏匹配，并提升正则表达式运行效率，就是我们的目标。本文所提出的经验，主要是针对这种情况。 1. 掌握语法细节。 正则表达式在各种语言中，其语法大致相同，细节各有千秋。明确所使用语言的正则的语法的细节，是写出正确、高效正则表达式的基础。例如，perl中与\w等效的匹配范围是[a-zA-Z0-9_]；perl正则式不支持肯定逆序环视中使用可变的重复（variable repetition inside lookbehind，例如(?&#60;=.*)abc），但是.Net语法是支持这一特性的；又如，JavaScript连逆序环视（Lookbehind,如(?&#60;=ab)c）都不支持，而perl和python是支持的。《精通正则表达式》第3章《正则表达式的特性和流派概览》明确地列出了各大派系正则的异同，这篇文章也简要地列出了几种常用语言、工具中正则的比较。对于具体使用者而言，至少应该详细了解正在使用的那种工作语言里正则的语法细节。 2. 先粗后精，先加后减。 使用正则表达式语法对于目标文本进行描述和界定，可以像画素描一样，先大致勾勒出框架，再逐步在局步实现细节。仍举刚才的手机号的例子，先界定\d{11}，总不会错；再细化为1[358]\d{9}，就向前迈了一大步（至于第二位是不是3、5、8，这里无意深究，只举这样一个例子，说明逐步细化的过程）。这样做的目的是先消除漏匹配（刚开始先尽可能多地匹配，做加法），然后再一点一点地消除误匹配（做减法）。这样有先有后，在考虑时才不易出错，从而向“不误不漏”这个目标迈进。 3. 留有余地。 所能看到的文本sample是有限的，而待匹配检验的文本是海量的，暂时不可见的。对于这样的情况，在写正则表达式时要跳出所能见到的文本的圈子，开拓思路，作出“战略性前瞻”。例如，经常收到这样的垃圾短信：“发*票”、“发#漂”。如果要写规则屏蔽这样烦人的垃圾短信，不但要能写出可以匹配当前文本的正则表达式 发[*#](?:票&#124;漂)，还要能够想到 发.(?:票&#124;漂&#124;飘)之类可能出现的“变种”。这在具体的领域或许会有针对性的规则，不多言。这样做的目的是消除漏匹配，延长正则表达式的生命周期。 4. 明确。 具体说来，就是谨慎用点号这样的元字符，尽可能不用星号和加号这样的任意量词。只要能确定范围的，例如\w，就不要用点号；只要能够预测重复次数的，就不要用任意量词。例如，写析取twitter消息的脚本，假设一条消息的xml正文部分结构是…且正文中无尖括号，那么[^&#60;]{1,480}这种写法的思路要好于.*，原因有二：一是使用[^&#60;]，它保证了文本的范围不会超出下一个小于号所在的位置；二是明确长度范围，{1,480}，其依据是一条twitter消息大致能的字符长度范围。当然，480这个长度是否正确还可推敲，但是这种思路是值得借鉴的。说得狠一点，“滥用点号、星号和加号是不环保、不负责任的做法”。 5. 不要让稻草压死骆驼。 每使用一个普通括号()而不是非捕获型括号(?:…)，就会保留一部分内存等着你再次访问。这样的正则表达式、无限次地运行次数，无异于一根根稻草的堆加，终于能将骆驼压死。养成合理使用(?:…)括号的习惯。 6. 宁简勿繁。 将一条复杂的正则表达式拆分为两条或多条简单的正则表达式，编程难度会降低，运行效率会提升。例如用来消除行首和行尾空白字符的正则表达式s/^\s+&#124;\s+$//g;，其运行效率理论上要低于s/^\s+//g; s/\s+$//g; 。这个例子出自《精通正则表达式》第五章，书中对它的评论是“它几乎总是最快的，而且显然最容易理解”。既快又容易理解，何乐而不为？工作中我们还有其它的理由要将C==(A&#124;B)这样的正则表达式拆为A和B两条表达式分别执行。例如，虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配，但是如果只要有一条子表达式（例如A）会产生误匹配，那么不论其它的子表达式（例如B）效率如何之高，范围如何精准，C的总体精准度也会因A而受到影响。 7. 巧妙定位。 有时候，我们需要匹配的the，是作为单词的the（两边有空格），而不是作为单词一部分的t-h-e的有序排列（例如together中的the）。在适当的时候用上^，$，\b等等定位锚点，能有效提升找到成功匹配、淘汰不成功匹配的效率。 总结完发现，《精通正则表达式》的第5章、第6章已经以更为有条理的方式总结出了常用的优化方法。不过，泛泛地读过的印象是肤浅的，过后即忘的；而真正若有所悟时在书上得到了系统地印证，这种感觉才是真的爽。 作者: 石巍 原载: 我爱正则表达式 版权所有，转载时必须以超链接形式注明作者和原始出处及本声明。 本文链接: http://www.smartwei.com/regex-optimizing.html]]></description>
			<content:encoded><![CDATA[<p>本文转自<a href="http://iregex.org/blog/regex-optimizing.html">我爱正则表达式</a> &#8211; 一个关于正则表达式的博客，作者对正则表达式很有研究，感兴趣的朋友可以去访问一下。</p>
<p><span style="color:#999;">&#8212;分割线&#8212;</span></p>
<p>如果纯粹是为了挑战自己的正则水平，用来实现一些特效（例如使用正则表达式计算质数、解线性方程），效率不是问题；如果所写的正则表达式只是为了满足一两次、几十次的运行，优化与否区别也不太大。但是，如果所写的正则表达式会百万次、千万次地运行，效率就是很大的问题了。我这里总结了几条<strong>提升正则表达式运行效率</strong>的经验（工作中学到的，看书学来的，自己的体会），贴在这里。如果您有其它的经验而这里没有提及，欢迎赐教。</p>
<p><strong>为行文方便，先定义两个概念。</strong></p>
<ul>
<li>误匹配：指正则表达式所匹配的内容范围超出了所需要范围，有些文本明明不符合要求，但是被所写的正则式“击中了”。例如，如果使用\d{11}来匹配11位的手机号，\d{11}不单能匹配正确的手机号，它还会匹配98765432100这样的明显不是手机号的字符串。我们把这样的匹配称之为误匹配。</li>
<li>漏匹配：指正则表达式所匹配的内容所规定的范围太狭窄，有些文本确实是所需要的，但是所写的正则没有将这种情况囊括在内。例如，使用\d{18}来匹配18位的身份证号码，就会漏掉结尾是字母X的情况。</li>
</ul>
<p>写出一条正则表达式，既可能只出现误匹配（条件写得极宽松，其范围大于目标文本），也可能只出现漏匹配（只描述了目标文本中多种情况种的一种），还可能既有误匹配又有漏匹配。例如，使用\w+\.com来匹配.com结尾的域名，既会误匹配abc_.com这样的字串（合法的域名中不含下划线，\w包含了下划线这种情况），又会漏掉ab-c.com这样的域名（合法域名中可以含中划线，但是\w不匹配中划线）。</p>
<p><strong>精准的正则表达式</strong>意味着既无误匹配且无漏匹配。当然，现实中存在这样的情况：只能看到有限数量的文本，根据这些文本写规则，但是这些规则将会用到海量的文本中。这种情况下，尽可能地（如果不是完全地）消除误匹配以及漏匹配，并<strong>提升正则表达式运行效率</strong>，就是我们的目标。本文所提出的经验，主要是针对这种情况。</p>
<p><strong style="background-color:#333; color:#FFF;">1. 掌握语法细节。</strong><br />
正则表达式在各种语言中，其语法大致相同，细节各有千秋。明确所使用语言的正则的语法的细节，是写出正确、<strong>高效正则表达式</strong>的基础。例如，perl中与\w等效的匹配范围是[a-zA-Z0-9_]；perl正则式不支持肯定逆序环视中使用可变的重复（variable repetition inside lookbehind，例如(?&lt;=.*)abc），但是.Net语法是支持这一特性的；又如，JavaScript连逆序环视（Lookbehind,如(?&lt;=ab)c）都不支持，而perl和python是支持的。《精通正则表达式》第3章《正则表达式的特性和流派概览》明确地列出了各大派系正则的异同，这篇文章也简要地列出了几种常用语言、工具中正则的比较。对于具体使用者而言，至少应该详细了解正在使用的那种工作语言里正则的语法细节。</p>
<p><strong style="background-color:#333; color:#FFF;">2. 先粗后精，先加后减。</strong><br />
使用正则表达式语法对于目标文本进行描述和界定，可以像画素描一样，先大致勾勒出框架，再逐步在局步实现细节。仍举刚才的手机号的例子，先界定\d{11}，总不会错；再细化为1[358]\d{9}，就向前迈了一大步（至于第二位是不是3、5、8，这里无意深究，只举这样一个例子，说明逐步细化的过程）。这样做的目的是先消除漏匹配（刚开始先尽可能多地匹配，做加法），然后再一点一点地消除误匹配（做减法）。这样有先有后，在考虑时才不易出错，从而向“不误不漏”这个目标迈进。</p>
<p><strong style="background-color:#333; color:#FFF;">3. 留有余地。</strong><br />
所能看到的文本sample是有限的，而待匹配检验的文本是海量的，暂时不可见的。对于这样的情况，在写正则表达式时要跳出所能见到的文本的圈子，开拓思路，作出“战略性前瞻”。例如，经常收到这样的垃圾短信：“发*票”、“发#漂”。如果要写规则屏蔽这样烦人的垃圾短信，不但要能写出可以匹配当前文本的正则表达式 发[*#](?:票|漂)，还要能够想到 发.(?:票|漂|飘)之类可能出现的“变种”。这在具体的领域或许会有针对性的规则，不多言。这样做的目的是消除漏匹配，延长正则表达式的生命周期。</p>
<p><strong style="background-color:#333; color:#FFF;">4. 明确。</strong><br />
具体说来，就是谨慎用点号这样的元字符，尽可能不用星号和加号这样的任意量词。只要能确定范围的，例如\w，就不要用点号；只要能够预测重复次数的，就不要用任意量词。例如，写析取twitter消息的脚本，假设一条消息的xml正文部分结构是<span class="”msg”">…</span>且正文中无尖括号，那么<span class="”msg”">[^&lt;]{1,480}</span>这种写法的思路要好于<span class="”msg”">.*</span>，原因有二：一是使用[^&lt;]，它保证了文本的范围不会超出下一个小于号所在的位置；二是明确长度范围，{1,480}，其依据是一条twitter消息大致能的字符长度范围。当然，480这个长度是否正确还可推敲，但是这种思路是值得借鉴的。说得狠一点，“滥用点号、星号和加号是不环保、不负责任的做法”。</p>
<p><strong style="background-color:#333; color:#FFF;">5. 不要让稻草压死骆驼。</strong><br />
每使用一个普通括号()而不是非捕获型括号(?:…)，就会保留一部分内存等着你再次访问。这样的正则表达式、无限次地运行次数，无异于一根根稻草的堆加，终于能将骆驼压死。养成合理使用(?:…)括号的习惯。</p>
<p><strong style="background-color:#333; color:#FFF;">6. 宁简勿繁。</strong><br />
将一条复杂的正则表达式拆分为两条或多条简单的正则表达式，编程难度会降低，运行效率会提升。例如用来消除行首和行尾空白字符的正则表达式s/^\s+|\s+$//g;，其运行效率理论上要低于s/^\s+//g; s/\s+$//g; 。这个例子出自《精通正则表达式》第五章，书中对它的评论是“它几乎总是最快的，而且显然最容易理解”。既快又容易理解，何乐而不为？工作中我们还有其它的理由要将C==(A|B)这样的正则表达式拆为A和B两条表达式分别执行。例如，虽然A和B这两种情况只要有一种能够击中所需要的文本模式就会成功匹配，但是如果只要有一条子表达式（例如A）会产生误匹配，那么不论其它的子表达式（例如B）效率如何之高，范围如何精准，C的总体精准度也会因A而受到影响。</p>
<p><strong style="background-color:#333; color:#FFF;">7. 巧妙定位。</strong><br />
有时候，我们需要匹配的the，是作为单词的the（两边有空格），而不是作为单词一部分的t-h-e的有序排列（例如together中的the）。在适当的时候用上^，$，\b等等定位锚点，能有效提升找到成功匹配、淘汰不成功匹配的效率。</p>
<p>总结完发现，《精通正则表达式》的第5章、第6章已经以更为有条理的方式总结出了常用的优化方法。不过，泛泛地读过的印象是肤浅的，过后即忘的；而真正若有所悟时在书上得到了系统地印证，这种感觉才是真的爽。</p>
<p><em>作者:<span style="color: #0063dc;"> </span></em><strong><span style="color: #0063dc;">石巍</span></strong><em><br />
原载: </em><a href="http://iregex.org/blog/regex-optimizing.html">我爱正则表达式</a><em><br />
版权所有，转载时必须以超链接形式注明作者和原始出处及本声明。</em></p>
<p>本文链接: <a href="http://www.smartwei.com/regex-optimizing.html">http://www.smartwei.com/regex-optimizing.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.smartwei.com/regex-optimizing.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

