<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: 效率问题</title>
	<atom:link href="http://iregex.org/blog/20091022-efficiency.html/feed" rel="self" type="application/rss+xml" />
	<link>http://iregex.org/blog/20091022-efficiency.html</link>
	<description>原创、翻译、转载关于正则表达式的文章</description>
	<lastBuildDate>Fri, 30 Jul 2010 03:24:50 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<item>
		<title>By: cnhacktnt</title>
		<link>http://iregex.org/blog/20091022-efficiency.html/comment-page-1#comment-1714</link>
		<dc:creator>cnhacktnt</dc:creator>
		<pubDate>Fri, 23 Oct 2009 10:55:23 +0000</pubDate>
		<guid isPermaLink="false">http://iregex.org/?p=70#comment-1714</guid>
		<description>忘了补充一点，在不需要捕获匹配字符串的情况下，不要用 ()，而是用(?:) 这种非捕获括号来代替，这个也是很重要的优化手段</description>
		<content:encoded><![CDATA[<p>忘了补充一点，在不需要捕获匹配字符串的情况下，不要用 ()，而是用(?:) 这种非捕获括号来代替，这个也是很重要的优化手段</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: cnhacktnt</title>
		<link>http://iregex.org/blog/20091022-efficiency.html/comment-page-1#comment-1711</link>
		<dc:creator>cnhacktnt</dc:creator>
		<pubDate>Fri, 23 Oct 2009 09:15:15 +0000</pubDate>
		<guid isPermaLink="false">http://iregex.org/?p=70#comment-1711</guid>
		<description>一条测试数据不足以说明它们的性能差异，你可以简单地做如下修改：
----
1. 测试字符串改成 &quot;----aba134babdedfg@&amp;%\n&quot;,

2. Regex3 = re.compile(&quot;^(?![0-9a-zA-Z]{8,16}$&#124;[@%&amp;]{8,16}$)[a-zA-Z0-9@%&amp;]{8,16}$&quot;, re.MULTILINE)

立马你就可以看到差异：
-----
R1 takes 0.734 seconds
R2 takes 2.041 seconds
R3 takes 0.797 seconds

这说明，一个或单单几个字符串来测试正则的性能，不靠谱，你可不知道用户输入的成千上万不同的字符组合是什么。

那么引申出正则的优化法则：
----
1. 尽可能将需要匹配的字符串显式地列出来，[a-zA-Z] 显然比 /[a-z]/i 要效率高，而 [abcde...审略...z] 更好一些

2. 包含更可能少的可能性，范围越窄越好。比如括号，嵌套括号，括号中的或条件；比如大括号中指定的范围以及贪婪匹配*，+符号；这些尽量少用或不用。

3. 单行匹配就可以的绝不多行匹配

4. 尽可能地让正则表达式提早结束，也就是说在碰到不匹配的字符串式尽早让正则表达式失败退出。

关于第4点，可以做个实验：
----
在前面做的修改的基础上，改一下 R3：
Regex3 = re.compile(&quot;^(?=[a-zA-Z0-9@%&amp;])(?![0-9a-zA-Z]{8,16}$&#124;[@%&amp;]{8,16}$)[a-zA-Z0-9@%&amp;]{8,16}$&quot;, re.MULTILINE)

看结果：
----
R1 takes 0.851 seconds
R2 takes 2.045 seconds
R3 takes 0.707 seconds

瞧，R3 最快，但正如以上所说，这条测试最快，不代表它在所有环境中都最快，所以根据实际环境来进行优化才算是王道。
另外，尽可能在前台，使用一些限定，比如javascript做用户输入检测，来限定用户输入的字符串范围，也可以为后台的正则优化提供依据。
不过还是要重申一下，正则不是万能，复杂要求的输入验证不一定要完全用正则来解决，当然你不在乎性能，不差钱除外 :-P</description>
		<content:encoded><![CDATA[<p>一条测试数据不足以说明它们的性能差异，你可以简单地做如下修改：<br />
&#8212;-<br />
1. 测试字符串改成 &#8220;&#8212;-aba134babdedfg@&amp;%\n&#8221;,</p>
<p>2. Regex3 = re.compile(&#8220;^(?![0-9a-zA-Z]{8,16}$|[@%&amp;]{8,16}$)[a-zA-Z0-9@%&amp;]{8,16}$&#8221;, re.MULTILINE)</p>
<p>立马你就可以看到差异：<br />
&#8212;&#8211;<br />
R1 takes 0.734 seconds<br />
R2 takes 2.041 seconds<br />
R3 takes 0.797 seconds</p>
<p>这说明，一个或单单几个字符串来测试正则的性能，不靠谱，你可不知道用户输入的成千上万不同的字符组合是什么。</p>
<p>那么引申出正则的优化法则：<br />
&#8212;-<br />
1. 尽可能将需要匹配的字符串显式地列出来，[a-zA-Z] 显然比 /[a-z]/i 要效率高，而 [abcde...审略...z] 更好一些</p>
<p>2. 包含更可能少的可能性，范围越窄越好。比如括号，嵌套括号，括号中的或条件；比如大括号中指定的范围以及贪婪匹配*，+符号；这些尽量少用或不用。</p>
<p>3. 单行匹配就可以的绝不多行匹配</p>
<p>4. 尽可能地让正则表达式提早结束，也就是说在碰到不匹配的字符串式尽早让正则表达式失败退出。</p>
<p>关于第4点，可以做个实验：<br />
&#8212;-<br />
在前面做的修改的基础上，改一下 R3：<br />
Regex3 = re.compile(&#8220;^(?=[a-zA-Z0-9@%&amp;])(?![0-9a-zA-Z]{8,16}$|[@%&amp;]{8,16}$)[a-zA-Z0-9@%&amp;]{8,16}$&#8221;, re.MULTILINE)</p>
<p>看结果：<br />
&#8212;-<br />
R1 takes 0.851 seconds<br />
R2 takes 2.045 seconds<br />
R3 takes 0.707 seconds</p>
<p>瞧，R3 最快，但正如以上所说，这条测试最快，不代表它在所有环境中都最快，所以根据实际环境来进行优化才算是王道。<br />
另外，尽可能在前台，使用一些限定，比如javascript做用户输入检测，来限定用户输入的字符串范围，也可以为后台的正则优化提供依据。<br />
不过还是要重申一下，正则不是万能，复杂要求的输入验证不一定要完全用正则来解决，当然你不在乎性能，不差钱除外 <img src='http://iregex.org/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: rex</title>
		<link>http://iregex.org/blog/20091022-efficiency.html/comment-page-1#comment-1707</link>
		<dc:creator>rex</dc:creator>
		<pubDate>Thu, 22 Oct 2009 12:17:39 +0000</pubDate>
		<guid isPermaLink="false">http://iregex.org/?p=70#comment-1707</guid>
		<description>R3的flag中含有re.IGNORECASE。将其去掉，在正则[]中加入A-Z，时间可以缩短到2秒多。</description>
		<content:encoded><![CDATA[<p>R3的flag中含有re.IGNORECASE。将其去掉，在正则[]中加入A-Z，时间可以缩短到2秒多。</p>
]]></content:encoded>
	</item>
</channel>
</rss>
