<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>笨笨温暖的家</title>
    <description>设计需要时间来沉淀.</description>
    <link>http://bbx.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>理解Ruby中的标志（Understanding Ruby Symbols）</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/53574" style="color:red;">http://bbx.javaeye.com/blog/53574</a>&nbsp;
          发表时间: 2007年02月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>理解Ruby中的标志（Understanding Ruby Symbols） <br />
原文出处：http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols <br />
翻译：Suninny AT Gmail.com</p>
<p>标志在Ruby中是一个迷。我们用她，但多数人并不真正懂她。 <br />
什么是标志？ <br />
简单来说，标志是你用来代表名字或字符串的一个东西。这可以归结为一种高效的描述名－－产生单一的字符串用于每个命名实例，这样就节省了空间。 <br />
琼斯博士的案例</p>
<p>琼斯博士（Dr Jones）是个心理学家。 他通常使用语词联想试验诊断患者，并且使用Ruby记录一切。 他的第一名患者Why来到了这里：</p>
<p>Dr J: Red <br />
Why : Ruby <br />
Dr J: Transportation <br />
Why : Rails <br />
Dr J: Chunky <br />
Why : Bacon</p>
<p>琼斯博士建立一个散列来存储这些数据：</p>
<p>　why = {&rdquo;red&rdquo; =&gt; &ldquo;ruby&rdquo;, &ldquo;transportation&rdquo; =&gt; &ldquo;rails&rdquo;, &ldquo;chunky&rdquo; =&gt; &ldquo;bacon&rdquo;}</p>
<p>问题所在</p>
<p>在进行几百个语词联想试验之后，琼斯博士开始意识到他用尽了内存! 于是琼斯在irb进行测试：</p>
<p>&gt; patient1 = { &ldquo;ruby&rdquo; =&gt; &ldquo;red&rdquo; } <br />
&gt; patient2 = { &ldquo;ruby&rdquo; =&gt; &ldquo;programming&rdquo; } <br />
&gt; patient1.each_key {|key| puts key.object_id.to_s} <br />
211006 <br />
&gt; patient2.each_key {|key| puts key.object_id.to_s} <br />
203536</p>
<p>我们看到，每次他建立一个散列来存储信息，Ruby就在不同的内存位置为每个键建立了一个新的字符串对象。</p>
<p>幸运的是，我们还有其他的方法。</p>
<p>用标志来突围</p>
<p>不同于字符串，在一个Ruby会话期间，同一个名称的标志只作一次初始化然后就存在于内存中。当你需要重用字符串来表示其他东西时，标志是再适合不过的了。重做琼斯博士的测试，我们能直接观察到：</p>
<p>&gt; patient1 = { :ruby =&gt; &ldquo;red&rdquo; } <br />
&gt; patient2 = { :ruby =&gt; &ldquo;programming&rdquo; } <br />
&gt; patient1.each_key {|key| puts key.object_id.to_s} <br />
3918094 <br />
&gt; patient2.each_key {|key| puts key.object_id.to_s} <br />
3918094</p>
<p>通过使用标志，在语词联想试验中我们用单一的内存地址代表了&ldquo;ruby&rdquo;这个单词。随着时间的推移，这能节省下大量的空间。 <br />
标志的其他应用场合 <br />
无论何时，只要你是重用一个单词来反复代表其他东西，标志就能派上用场。不管是散列中的一个键，还是Http查询中的一个方法。在最新、最伟大的Web框架－－Ruby on Rails的路由和链接中就应用到了标志。</p>
<p>在表现一个网页之前，Rails会执行框架内部的控制器（controllers）中定义的动作（actions），因此在Rails中，链接就像这样表示：</p>
<p>link_to(&rdquo;View Article&rdquo;, :controller =&gt; &ldquo;articles&rdquo;, :action =&gt; &ldquo;show&rdquo;, :id =&gt; 1)</p>
<p>当一个应用可能至少有数百个链接，或者说有数百个不同动作和控制器的引用时，使用标志就比使用字符串高效得多。</p>
<p>最后，值得注意的是标志的应用场合并不局限于散列中的键。例如，如果你写一个Http客户端（或服务器），在这个程序中，可能需要多次用到get和post：</p>
<p>do_this if query == :get</p>
<p>&hellip; <br />
send_message_to_server(:post,filename)</p>
<p>当需要反复用到一个字符串时，标志或许是一个蛮不错的替代品。</p>
<p>更新 <br />
在Freenode（译注：一个著名的IRC服务器）的ruby-lang频道，Aria和Nome为这篇文章给出了有用的增补。</p>
<p>11:58 &lt; Aria&gt; 同样，即便完全出于现实方面的考虑，使用标志也很理想：如果你要引用一个方法名，就用标志吧，因为她总会在那里（在定义了方法之后）。 <br />
12:03 &lt; nome&gt; Kevin Clark：标志的目的是用来辨别构造（主要是用户级的）：散列中的槽、一个方法、一个选项等等。</p>
<p>同样，Aria还回应了Geoff在注解中提出的问题：</p>
<p>Geoff：我很想知道1000个字符串&rdquo;red&rdquo;究竟要比:red耗费多少内存。记住，在Rails之外，&rdquo;red&rdquo; != :red</p>
<p>Aria：多少内存？20字节/对象，加上存储数据的3个字节，再加上存储长度的4个字节，一共是27&times;1000＝27000个字节。与此相对，标志表条目的一份拷贝，只需几个字节。</p>
<p>Jim Weirich 写到： <br />
我通常有下面的法则来比较字符串和标志： <br />
(1) 如果侧重于对象的内容（即字符序列），就用字符串； <br />
(2) 如果侧重于对象的身份，就用标志。 </p>
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/53574#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Feb 2007 19:33:46 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/53574</link>
        <guid>http://bbx.javaeye.com/blog/53574</guid>
      </item>
      <item>
        <title>中文字符串，如何Substr呢</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/53570" style="color:red;">http://bbx.javaeye.com/blog/53570</a>&nbsp;
          发表时间: 2007年02月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在config/environment.rb里加上一行：$KCODE = 'utf8' <br />
或则在启动的时候加上ruby.exe -KU script/server <br />
然后就可以用split方法把string转成char来进行截取 <br />
如&lt;%= @title.split(//)[0,10] %&gt; #截取title字段的前10个字符</p>
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/53570#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Feb 2007 18:05:21 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/53570</link>
        <guid>http://bbx.javaeye.com/blog/53570</guid>
      </item>
      <item>
        <title>JS的正则表达式</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/52961" style="color:red;">http://bbx.javaeye.com/blog/52961</a>&nbsp;
          发表时间: 2007年02月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>//校验是否全由数字组成 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isDigit(s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;patrn=/^[</span><span class="number">0</span><span>-</span><span class="number">9</span><span>]{</span><span class="number">1</span><span>,</span><span class="number">20</span><span>}$/; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>//校验登录名：只能输入5-20个以字母开头、可带数字、&ldquo;_&rdquo;、&ldquo;.&rdquo;的字串 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isRegisterUserName(s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;patrn=/^[a-zA-Z]{</span><span class="number">1</span><span>}([a-zA-Z0-</span><span class="number">9</span><span>]|[._]){</span><span class="number">4</span><span>,</span><span class="number">19</span><span>}$/; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>//校验用户姓名：只能输入1-30个以字母开头的字串 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isTrueName(s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;patrn=/^[a-zA-Z]{</span><span class="number">1</span><span>,</span><span class="number">30</span><span>}$/; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//校验密码：只能输入6-20个字母、数字、下划线 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>[code] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>function&nbsp;isPasswd(s) &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;patrn=/^(\w){</span><span class="number">6</span><span>,</span><span class="number">20</span><span>}$/; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>//校验普通电话、传真号码：可以&ldquo;+&rdquo;开头，除数字外，可含有&ldquo;-&rdquo; <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isTel(s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//var&nbsp;patrn=/^[+]{0,1}(\d){1,3}[&nbsp;]?([-]?(\d){1,12})+$/; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;patrn=/^[+]{</span><span class="number">0</span><span>,</span><span class="number">1</span><span>}(\d){</span><span class="number">1</span><span>,</span><span class="number">3</span><span>}[&nbsp;]?([-]?((\d)|[&nbsp;]){</span><span class="number">1</span><span>,</span><span class="number">12</span><span>})+$/; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>//校验手机号码：必须以数字开头，除数字外，可含有&ldquo;-&rdquo; <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isMobil(s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;patrn=/^[+]{</span><span class="number">0</span><span>,</span><span class="number">1</span><span>}(\d){</span><span class="number">1</span><span>,</span><span class="number">3</span><span>}[&nbsp;]?([-]?((\d)|[&nbsp;]){</span><span class="number">1</span><span>,</span><span class="number">12</span><span>})+$/; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>//校验邮政编码 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isPostalCode(s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//var&nbsp;patrn=/^[a-zA-Z0-9]{3,12}$/; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;patrn=/^[a-zA-Z0-</span><span class="number">9</span><span>&nbsp;]{</span><span class="number">3</span><span>,</span><span class="number">12</span><span>}$/; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>//校验搜索关键字 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;isSearch(s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;patrn=/^[^`~!@#$%^&amp;*()+=|\\\][\]\{\}:;'\,.&lt;&gt;/?]{</span><span class="number">1</span><span>}[^`~!@$%^&amp;()+=|\\\] &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[\]\{\}:;'\,.&lt;&gt;?]{</span><span class="number">0</span><span>,</span><span class="number">19</span><span>}$/; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>function&nbsp;isIP(s)&nbsp;</span><span class="comment">//by&nbsp;zergling </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;patrn=/^[</span><span class="number">0</span><span>-</span><span class="number">9</span><span>.]{</span><span class="number">1</span><span>,</span><span class="number">20</span><span>}$/; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(!patrn.exec(s))&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 18pt">正则表达式</span> <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="string">&quot;^\\d+$&quot;</span><span>　　</span><span class="comment">//非负整数（正整数&nbsp;+&nbsp;0） </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="string">&quot;^[0-9]*[1-9][0-9]*$&quot;</span><span>　　</span><span class="comment">//正整数&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^((-\\d+)|(0+))$&quot;</span><span>　　</span><span class="comment">//非正整数（负整数&nbsp;+&nbsp;0）&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^-[0-9]*[1-9][0-9]*$&quot;</span><span>　　</span><span class="comment">//负整数&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^-?\\d+$&quot;</span><span>　　　　</span><span class="comment">//整数&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^\\d+(\\.\\d+)?$&quot;</span><span>　　</span><span class="comment">//非负浮点数（正浮点数&nbsp;+&nbsp;0）&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$&quot;</span><span>　 &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//正浮点数&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$&quot;</span><span>　　</span><span class="comment">//非正浮点数（负浮点数&nbsp;+&nbsp;0）&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$&quot;</span><span>　 &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//负浮点数&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^(-?\\d+)(\\.\\d+)?$&quot;</span><span>　　</span><span class="comment">//浮点数&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^[A-Za-z]+$&quot;</span><span>　　</span><span class="comment">//由26个英文字母组成的字符串&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^[A-Z]+$&quot;</span><span>　　</span><span class="comment">//由26个英文字母的大写组成的字符串&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^[a-z]+$&quot;</span><span>　　</span><span class="comment">//由26个英文字母的小写组成的字符串&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^[A-Za-z0-9]+$&quot;</span><span>　　</span><span class="comment">//由数字和26个英文字母组成的字符串&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^\\w+$&quot;</span><span>　　</span><span class="comment">//由数字、26个英文字母或者下划线组成的字符串&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$&quot;</span><span>　　　　</span><span class="comment">//email地址&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$&quot;</span><span>　　//url &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="string">&quot;^[A-Za-z0-9_]*$&quot;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 18pt">正则表达式使用详解</span></p>
<p>简介 </p>
<p>简单的说，正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下： <br />
测试字符串的某个模式。例如，可以对一个输入字符串进行测试，看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。 <br />
替换文本。可以在文档中使用一个正则表达式来标识特定文字，然后可以全部将其删除，或者替换为别的文字。 <br />
根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。 </p>
<p>基本语法 </p>
<p>在对正则表达式的功能和作用有了初步的了解之后，我们就来具体看一下正则表达式的语法格式。 <br />
<br />
正则表达式的形式一般如下：　　</p>
<p>/love/　　其中位于&ldquo;/&rdquo;定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入&ldquo;/&rdquo;定界符之间即可。为了能够使用户更加灵活的定制模式内容，正则表达式提供了专门的&ldquo;元字符&rdquo;。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符，可以用来规定其前导字符（即位于元字符前面的字符）在目标对象中的出现模式。 <br />
较为常用的元字符包括： &ldquo;+&rdquo;， &ldquo;*&rdquo;，以及 &ldquo;?&rdquo;。</p>
<p>&ldquo;+&rdquo;元字符规定其前导字符必须在目标对象中连续出现一次或多次。</p>
<p>&ldquo;*&rdquo;元字符规定其前导字符必须在目标对象中出现零次或连续多次。</p>
<p>&ldquo;?&rdquo;元字符规定其前导对象必须在目标对象中连续出现零次或一次。</p>
<p>下面，就让我们来看一下正则表达式元字符的具体应用。 </p>
<p>/fo+/　　因为上述正则表达式中包含&ldquo;+&rdquo;元字符，表示可以与目标对象中的 &ldquo;fool&rdquo;, &ldquo;fo&rdquo;, 或者 &ldquo;football&rdquo;等在字母f后面连续出现一个或多个字母o的字符串相匹配。 </p>
<p>/eg*/　　因为上述正则表达式中包含&ldquo;*&rdquo;元字符，表示可以与目标对象中的 &ldquo;easy&rdquo;, &ldquo;ego&rdquo;, 或者 &ldquo;egg&rdquo;等在字母e后面连续出现零个或多个字母g的字符串相匹配。 </p>
<p>/Wil?/　　因为上述正则表达式中包含&ldquo;？&rdquo;元字符，表示可以与目标对象中的 &ldquo;Win&rdquo;, 或者&ldquo;Wilson&rdquo;,等在字母i后面连续出现零个或一个字母l的字符串相匹配。 </p>
<p>有时候不知道要匹配多少字符。为了能适应这种不确定性，正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。</p>
<p>{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 &quot;Bob&quot; 中的 'o'，但是能匹配 &quot;food&quot; 中的两个 o。</p>
<p>{n,} n 是一个非负整数。至少匹配 n 次。例如，'o{2,}' 不能匹配 &quot;Bob&quot; 中的 'o'，但能匹配 &quot;foooood&quot; 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。</p>
<p>{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。例如，&quot;o{1,3}&quot; 将匹配 &quot;fooooood&quot; 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。</p>
<p>除了元字符之外，用户还可以精确指定模式在匹配对象中出现的频率。例如，/jim {2,6}/ 上述正则表达式规定字符m可以在匹配对象中连续出现2-6次，因此，上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。 <br />
在对如何使用正则表达式有了初步了解之后，我们来看一下其它几个重要的元字符的使用方式。 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>\s：用于匹配单个空格符，包括tab键和换行符；&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>\S：用于匹配除单个空格符之外的所有字符；&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>\d：用于匹配从</span><span class="number">0</span><span>到</span><span class="number">9</span><span>的数字；&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>\w：用于匹配字母，数字或下划线字符；&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>\W：用于匹配所有与\w不匹配的字符；&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>.&nbsp;：用于匹配除换行符之外的所有字符。&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
（说明：我们可以把\s和\S以及\w和\W看作互为逆运算） <br />
下面，我们就通过实例看一下如何在正则表达式中使用上述元字符。 <br />
/\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。 <br />
/\d000/　如果我们手中有一份复杂的财务报表，那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。 <br />
除了我们以上所介绍的元字符之外，正则表达式中还具有另外一种较为独特的专用字符，即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括： &ldquo;^&rdquo;, &ldquo;$&rdquo;, &ldquo;\b&rdquo; 以及 &ldquo;\B&rdquo;。 <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>&ldquo;^&rdquo;定位符规定匹配模式必须出现在目标字符串的开头 &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&ldquo;$&rdquo;定位符规定匹配模式必须出现在目标对象的结尾 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&ldquo;\b&rdquo;定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一 &nbsp;&nbsp;</span></li>
    <li class=""><span>&ldquo;\B&rdquo;定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内， &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;即匹配对象既不能作为目标字符串的开头，也不能作为目标字符串的结尾。 &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
同样，我们也可以把&ldquo;^&rdquo;和&ldquo;$&rdquo;以及&ldquo;\b&rdquo;和&ldquo;\B&rdquo;看作是互为逆运算的两组定位符。举例来说： /^hell/　因为上述正则表达式中包含&ldquo;^&rdquo;定位符，所以可以与目标对象中以 &ldquo;hell&rdquo;, &ldquo;hello&rdquo;或&ldquo;hellhound&rdquo;开头的字符串相匹配。 /ar$/　因为上述正则表达式中包含&ldquo;$&rdquo;定位符，所以可以与目标对象中以 &ldquo;car&rdquo;, &ldquo;bar&rdquo;或 &ldquo;ar&rdquo; 结尾的字符串相匹配。 /\bbom/　因为上述正则表达式模式以&ldquo;\b&rdquo;定位符开头，所以可以与目标对象中以 &ldquo;bomb&rdquo;, 或 &ldquo;bom&rdquo;开头的字符串相匹配。/man\b/　因为上述正则表达式模式以&ldquo;\b&rdquo;定位符结尾，所以可以与目标对象中以 &ldquo;human&rdquo;, &ldquo;woman&rdquo;或 &ldquo;man&rdquo;结尾的字符串相匹配。 <br />
为了能够方便用户更加灵活的设定匹配模式，正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>/[A-Z]/　　上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。 &nbsp;&nbsp;</span></span></li>
    <li class=""><span>/[a-z]/　　上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/[</span><span class="number">0</span><span>-</span><span class="number">9</span><span>]/&nbsp;　上述正则表达式将会与从</span><span class="number">0</span><span>到</span><span class="number">9</span><span>范围内任何一个数字相匹配。&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>/([a-z][A-Z][</span><span class="number">0</span><span>-</span><span class="number">9</span><span>])+/　上述正则表达式将会与任何由字母和数字组成的字符串，如&nbsp;&ldquo;aB0&rdquo;&nbsp;等相匹配。 &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
这里需要提醒用户注意的一点就是可以在正则表达式中使用 &ldquo;()&rdquo; 把字符串组合在一起。&ldquo;()&rdquo;符号包含的内容必须同时出现在目标对象中。因此，上述正则表达式将无法与诸如 &ldquo;abc&rdquo;等的字符串匹配，因为&ldquo;abc&rdquo;中的最后一个字符为字母而非数字。 <br />
如果我们希望在正则表达式中实现类似编程逻辑中的&ldquo;或&rdquo;运算，在多个不同的模式中任选一个进行匹配的话，可以使用管道符 &ldquo;|&rdquo;。例如：/to|too|2/　上述正则表达式将会与目标对象中的 &ldquo;to&rdquo;, &ldquo;too&rdquo;, 或 &ldquo;2&rdquo; 相匹配。 <br />
正则表达式中还有一个较为常用的运算符，即否定符 &ldquo;[^]&rdquo;。与我们前文所介绍的定位符 &ldquo;^&rdquo; 不同，否定符 &ldquo;[^]&rdquo;规定目标对象中不能存在模式中所规定的字符串。例如：/[^A-C]/　上述字符串将会与目标对象中除A，B，和C之外的任何字符相匹配。一般来说，当&ldquo;^&rdquo;出现在 &ldquo;[]&rdquo;内时就被视做否定运算符；而当&ldquo;^&rdquo;位于&ldquo;[]&rdquo;之外，或没有&ldquo;[]&rdquo;时，则应当被视做定位符。 <br />
最后，当用户需要在正则表达式的模式中加入元字符，并查找其匹配对象时，可以使用转义符&ldquo;\&rdquo;。例如：/Th\*/ 　上述正则表达式将会与目标对象中的&ldquo;Th*&rdquo;而非&ldquo;The&rdquo;等相匹配。 <br />
在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先级顺序来求值。优先级如下： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="number">1</span><span>．\&nbsp;转义符 &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="number">2</span><span>．(),&nbsp;(?:),&nbsp;(?=),&nbsp;[]&nbsp;圆括号和方括号 &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="number">3</span><span>．*,&nbsp;+,&nbsp;?,&nbsp;{n},&nbsp;{n,},&nbsp;{n,m}&nbsp;限定符 &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="number">4</span><span>．^,&nbsp;$,&nbsp;\anymetacharacter&nbsp;位置和顺序 &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="number">5</span><span>．|&ldquo;或&rdquo;操作 &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 18pt">使用实例</span> <br />
在JavaScript 1.2中带有一个功能强大的RegExp()对象，可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式，并相应的返回true或false。 <br />
我们可以使用JavaScript编写以下脚本，验证用户输入的邮件地址的有效性。 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">language</span><span>=</span><span class="attribute-value">&quot;Javascript1.2&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　&nbsp;&lt;!--&nbsp;start&nbsp;hiding&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　&nbsp;function&nbsp;verifyAddress(obj)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　　　var&nbsp;</span><span class="attribute">email</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">obj</span><span>.email.value;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　　var&nbsp;</span><span class="attribute">pattern</span><span>&nbsp;=&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　　</span><span class="attribute">flag</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">pattern</span><span>.test(email);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　　　if(flag)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　　{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　　　　alert(&ldquo;Your&nbsp;email&nbsp;address&nbsp;is&nbsp;correct!&rdquo;);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　　　return&nbsp;true;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　　　}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　　else&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　　　　{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　　　　alert(&ldquo;Please&nbsp;try&nbsp;again!&rdquo;);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　　　　　return&nbsp;false;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　　　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　　&nbsp;//&nbsp;stop&nbsp;hiding&nbsp;--</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　</span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">form</span><span>&nbsp;</span><span class="attribute">onSubmit</span><span>=</span><span class="attribute-value">&quot;return&nbsp;verifyAddress(this);&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;email&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　　&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;submit&quot;</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　　&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">form</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　</span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 18pt">正则表达式对象</span> <br />
本对象包含正则表达式模式以及表明如何应用模式的标志。 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>语法&nbsp;</span><span class="number">1</span><span>&nbsp;re&nbsp;=&nbsp;/pattern/[flags] &nbsp;&nbsp;</span></span></li>
    <li class=""><span>语法&nbsp;</span><span class="number">2</span><span>&nbsp;re&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;RegExp(</span><span class="string">&quot;pattern&quot;</span><span>,[</span><span class="string">&quot;flags&quot;</span><span>])&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
参数 <br />
re <br />
必选项。将要赋值为正则表达式模式的变量名。
<p>&nbsp;</p>
<p>Pattern <br />
必选项。要使用的正则表达式模式。如果使用语法 1，用 &quot;/&quot; 字符分隔模式。如果用语法 2，用引号将模式引起来。 </p>
<p>Flags <br />
可选项。如果使用语法 2 要用引号将 flag 引起来。标志可以组合使用，可用的有： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>g&nbsp;（全文查找出现的所有&nbsp;pattern）&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>i&nbsp;（忽略大小写）&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>m&nbsp;（多行查找）&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 18pt">示例</span> <br />
下面的示例创建一个包含正则表达式模式及相关标志的对象(re)，向您演示正则表达式对象的用法。在本例中，作为结果的正则表达式对象又用于 match 方法中： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;MatchDemo() &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;r,&nbsp;re;&nbsp;</span><span class="comment">//&nbsp;声明变量。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;s&nbsp;=&nbsp;</span><span class="string">&quot;The&nbsp;rain&nbsp;in&nbsp;Spain&nbsp;falls&nbsp;mainly&nbsp;in&nbsp;the&nbsp;plain&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>re&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;RegExp(</span><span class="string">&quot;ain&quot;</span><span>,</span><span class="string">&quot;g&quot;</span><span>);&nbsp;</span><span class="comment">//&nbsp;创建正则表达式对象。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>r&nbsp;=&nbsp;s.match(re);&nbsp;</span><span class="comment">//&nbsp;在字符串&nbsp;s&nbsp;中查找匹配。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>(r);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>返回值： ain,ain,ain,ain\\ <br />
属性 lastIndex 属性 | source 属性\\ <br />
方法 compile 方法 | exec 方法 | test 方法\\ <br />
要求 版本 3\\ <br />
请参阅 RegExp 对象 | 正则表达式语法 | String 对象\\</p>
<p><span style="FONT-SIZE: 18pt">exec 方法</span> <br />
用正则表达式模式在字符串中运行查找，并返回包含该查找结果的一个数组。 <br />
rgExp.exec(str)</p>
<p>参数</p>
<p>rgExp <br />
必选项。包含正则表达式模式和可用标志的正则表达式对象。 </p>
<p>str <br />
必选项。要在其中执行查找的 String 对象或字符串文字。 </p>
<p>说明\\ <br />
如果 exec 方法没有找到匹配，则它返回 null。如果它找到匹配，则 exec 方法返回一个数组，并且更新全局 RegExp 对象的属性，以反映匹配结果。数组的0元素包含了完整的匹配，而第1到n元素中包含的是匹配中出现的任意一个子匹配。这相当于没有设置全局标志 (g) 的 match 方法。 <br />
如果为正则表达式设置了全局标志，exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志，exec 忽略 lastIndex 的值，从字符串的起始位置开始搜索。</p>
<p>exec 方法返回的数组有三个属性，分别是 input、index 和 lastIndex。Input 属性包含了整个被查找的字符串。Index 属性中包含了整个被查找字符串中被匹配的子字符串的位置。LastIndex 属性中包含了匹配中最后一个字符的下一个位置。</p>
<p>示例\\ <br />
下面的例子举例说明了 exec 方法的用法： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;RegExpTest() &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;ver&nbsp;=&nbsp;Number(ScriptEngineMajorVersion()&nbsp;+&nbsp;</span><span class="string">&quot;.&quot;</span><span>&nbsp;+&nbsp;ScriptEngineMinorVersion()) &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">if</span><span>&nbsp;(ver&nbsp;&gt;=&nbsp;</span><span class="number">5.5</span><span>){&nbsp;</span><span class="comment">//&nbsp;测试&nbsp;JScript&nbsp;的版本。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;src&nbsp;=&nbsp;</span><span class="string">&quot;The&nbsp;rain&nbsp;in&nbsp;Spain&nbsp;falls&nbsp;mainly&nbsp;in&nbsp;the&nbsp;plain.&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;re&nbsp;=&nbsp;/\w+/g;&nbsp;</span><span class="comment">//&nbsp;创建正则表达式模式。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;arr; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">while</span><span>&nbsp;((arr&nbsp;=&nbsp;re.exec(src))&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.write(arr.index&nbsp;+&nbsp;</span><span class="string">&quot;-&quot;</span><span>&nbsp;+&nbsp;arr.lastIndex&nbsp;+&nbsp;arr&nbsp;+&nbsp;</span><span class="string">&quot;\t&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">else</span><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>alert(</span><span class="string">&quot;请使用&nbsp;JScript&nbsp;的更新版本&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>返回值：0-3The 4-8rain 9-11in 12-17Spain 18-23falls 24-30mainly 31-33in 34-37the 38-43plain</p>
<p>test 方法\\ <br />
返回一个 Boolean 值，它指出在被查找的字符串中是否存在模式。 <br />
rgexp.test(str) </p>
<p>参数\\ <br />
rgexp <br />
必选项。包含正则表达式模式或可用标志的正则表达式对象。 </p>
<p>str <br />
必选项。要在其上测试查找的字符串。 </p>
<p>说明 <br />
test 方法检查在字符串中是否存在一个模式，如果存在则返回 true，否则就返回 false。 <br />
全局 RegExp 对象的属性不由 test 方法来修改。</p>
<p>示例 <br />
下面的例子举例说明了 test 方法的用法： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;TestDemo(re,&nbsp;s) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;s1;&nbsp;</span><span class="comment">//&nbsp;声明变量。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;检查字符串是否存在正则表达式。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;(re.test(s))&nbsp;</span><span class="comment">//&nbsp;测试是否存在。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>s1&nbsp;=&nbsp;</span><span class="string">&quot;&nbsp;contains&nbsp;&quot;</span><span>;&nbsp;</span><span class="comment">//&nbsp;s&nbsp;包含模式。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>s1&nbsp;=&nbsp;</span><span class="string">&quot;&nbsp;does&nbsp;not&nbsp;contain&nbsp;&quot;</span><span>;&nbsp;</span><span class="comment">//&nbsp;s&nbsp;不包含模式。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>(</span><span class="string">&quot;'&quot;</span><span>&nbsp;+&nbsp;s&nbsp;+&nbsp;</span><span class="string">&quot;'&quot;</span><span>&nbsp;+&nbsp;s1&nbsp;+&nbsp;</span><span class="string">&quot;'&quot;</span><span>+&nbsp;re.source&nbsp;+&nbsp;</span><span class="string">&quot;'&quot;</span><span>);&nbsp;</span><span class="comment">//&nbsp;返回字符串。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>函数调用：document.write (TestDemo(/ain+/ ,&quot;The rain in Spain falls mainly in the plain.&quot;));</p>
<p>返回值：'The rain in Spain falls mainly in the plain.' contains 'ain+'</p>
<p><span style="FONT-SIZE: 18pt">match 方法</span> <br />
使用正则表达式模式对字符串执行查找，并将包含查找的结果作为数组返回。\\ <br />
stringObj.match(rgExp) </p>
<p>参数\\ <br />
stringObj <br />
必选项。对其进行查找的 String 对象或字符串文字。 </p>
<p>rgExp <br />
必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。 </p>
<p>说明\\ <br />
如果 match 方法没有找到匹配，返回 null。如果找到匹配返回一个数组并且更新全局 RegExp 对象的属性以反映匹配结果。 <br />
match 方法返回的数组有三个属性：input、index 和 lastIndex。Input 属性包含整个的被查找字符串。Index 属性包含了在整个被查找字符串中匹配的子字符串的位置。LastIndex 属性包含了最后一次匹配中最后一个字符的下一个位置。 <br />
如果没有设置全局标志 (g)，数组的 0 元素包含整个匹配，而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的 exec 方法。如果设置了全局标志，元素 0 到 n 中包含所有匹配。</p>
<p>示例\\ <br />
下面的示例演示了match 方法的用法： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;MatchDemo() &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;r,&nbsp;re;&nbsp;</span><span class="comment">//&nbsp;声明变量。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;s&nbsp;=&nbsp;</span><span class="string">&quot;The&nbsp;rain&nbsp;in&nbsp;Spain&nbsp;falls&nbsp;mainly&nbsp;in&nbsp;the&nbsp;plain&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>re&nbsp;=&nbsp;/ain/i;&nbsp;</span><span class="comment">//&nbsp;创建正则表达式模式。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>r&nbsp;=&nbsp;s.match(re);&nbsp;</span><span class="comment">//&nbsp;尝试匹配搜索字符串。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>(r);&nbsp;</span><span class="comment">//&nbsp;返回第一次出现&nbsp;&quot;ain&quot;&nbsp;的地方。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
返回值：ain
<p>&nbsp;</p>
<p>本示例说明带 g 标志设置的 match 方法的用法。 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;MatchDemo() &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;r,&nbsp;re;&nbsp;</span><span class="comment">//&nbsp;声明变量。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;s&nbsp;=&nbsp;</span><span class="string">&quot;The&nbsp;rain&nbsp;in&nbsp;Spain&nbsp;falls&nbsp;mainly&nbsp;in&nbsp;the&nbsp;plain&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>re&nbsp;=&nbsp;/ain/ig;&nbsp;</span><span class="comment">//&nbsp;创建正则表达式模式。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>r&nbsp;=&nbsp;s.match(re);&nbsp;</span><span class="comment">//&nbsp;尝试去匹配搜索字符串。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>(r);&nbsp;</span><span class="comment">//&nbsp;返回的数组包含了所有&nbsp;&quot;ain&quot;&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;出现的四个匹配。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
返回值：ain,ain,ain,ain
<p>&nbsp;</p>
<p>上面几行代码演示了字符串文字的 match 方法的用法。 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>var&nbsp;r,&nbsp;re&nbsp;=&nbsp;</span><span class="string">&quot;Spain&quot;</span><span>; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>r&nbsp;=&nbsp;</span><span class="string">&quot;The&nbsp;rain&nbsp;in&nbsp;Spain&quot;</span><span>.replace(re,&nbsp;</span><span class="string">&quot;Canada&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;r; &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
返回值：The rain in Canada
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 18pt">search 方法</span> <br />
返回与正则表达式查找内容匹配的第一个子字符串的位置。</p>
<p>stringObj.search(rgExp)</p>
<p>参数\\ <br />
stringObj <br />
必选项。要在其上进行查找的 String 对象或字符串文字。 </p>
<p>rgExp <br />
必选项。包含正则表达式模式和可用标志的正则表达式对象。 </p>
<p>说明</p>
<p>search 方法指明是否存在相应的匹配。如果找到一个匹配，search 方法将返回一个整数值，指明这个匹配距离字符串开始的偏移位置。如果没有找到匹配，则返回 -1。</p>
<p>示例\\ <br />
下面的示例演示了 search 方法的用法。 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>function&nbsp;SearchDemo() &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>var&nbsp;r,&nbsp;re;&nbsp;</span><span class="comment">//&nbsp;声明变量。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;s&nbsp;=&nbsp;</span><span class="string">&quot;The&nbsp;rain&nbsp;in&nbsp;Spain&nbsp;falls&nbsp;mainly&nbsp;in&nbsp;the&nbsp;plain.&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>re&nbsp;=&nbsp;/falls/i;&nbsp;</span><span class="comment">//&nbsp;创建正则表达式模式。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>r&nbsp;=&nbsp;s.search(re);&nbsp;</span><span class="comment">//&nbsp;查找字符串。 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">return</span><span>(r);&nbsp;</span><span class="comment">//&nbsp;返回&nbsp;Boolean&nbsp;结果。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
返回值：18
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 18pt">正则表达式语法</span> <br />
一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。</p>
<p>这里有一些可能会遇到的正则表达式示例： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>JScript&nbsp;VBScript&nbsp;匹配&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>/^\[&nbsp;\t]*$/&nbsp;</span><span class="string">&quot;^\[&nbsp;\t]*$&quot;</span><span>&nbsp;匹配一个空白行。&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/\d{</span><span class="number">2</span><span>}-\d{</span><span class="number">5</span><span>}/&nbsp;</span><span class="string">&quot;\d{2}-\d{5}&quot;</span><span>&nbsp;验证一个ID&nbsp;号码是否由一个</span><span class="number">2</span><span>位数字，一个连字符以及一个</span><span class="number">5</span><span>位数字组成。&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>/&lt;(.*)&gt;.*&lt;\/\</span><span class="number">1</span><span>&gt;/&nbsp;</span><span class="string">&quot;&lt;(.*)&gt;.*&lt;\/\1&gt;&quot;</span><span>&nbsp;匹配一个&nbsp;HTML&nbsp;标记。&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>下表是元字符及其在正则表达式上下文中的行为的一个完整列表：</p>
<p>字符 描述 <br />
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 &quot;n&quot;。'\n' 匹配一个换行符。序列 '\\' 匹配 &quot;\&quot; 而 &quot;\(&quot; 则匹配 &quot;(&quot;。 </p>
<p>^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。 </p>
<p>$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。 </p>
<p>* 匹配前面的子表达式零次或多次。例如，zo* 能匹配 &quot;z&quot; 以及 &quot;zoo&quot;。 * 等价于{0,}。 </p>
<p>+ 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 &quot;zo&quot; 以及 &quot;zoo&quot;，但不能匹配 &quot;z&quot;。+ 等价于 {1,}。 </p>
<p>? 匹配前面的子表达式零次或一次。例如，&quot;do(es)?&quot; 可以匹配 &quot;do&quot; 或 &quot;does&quot; 中的&quot;do&quot; 。? 等价于 {0,1}。 </p>
<p>{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 &quot;Bob&quot; 中的 'o'，但是能匹配 &quot;food&quot; 中的两个 o。 </p>
<p>{n,} n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 &quot;Bob&quot; 中的 'o'，但能匹配 &quot;foooood&quot; 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 </p>
<p>{n,m} m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。刘， &quot;o{1,3}&quot; 将匹配 &quot;fooooood&quot; 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 </p>
<p>? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 &quot;oooo&quot;，'o+?' 将匹配单个 &quot;o&quot;，而 'o+' 将匹配所有 'o'。 </p>
<p>. 匹配除 &quot;\n&quot; 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。 <br />
(pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0&hellip;$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。 </p>
<p>(?:pattern) 匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 &quot;或&quot; 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 </p>
<p>(?=pattern) 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， 'Windows (?=95|98|NT|2000)' 能匹配 &quot;Windows 2000&quot; 中的 &quot;Windows&quot; ，但不能匹配 &quot;Windows 3.1&quot; 中的 &quot;Windows&quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。 </p>
<p>(?!pattern) 负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 &quot;Windows 3.1&quot; 中的 &quot;Windows&quot;，但不能匹配 &quot;Windows 2000&quot; 中的 &quot;Windows&quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 </p>
<p>x|y 匹配 x 或 y。例如，'z|food' 能匹配 &quot;z&quot; 或 &quot;food&quot;。'(z|f)ood' 则匹配 &quot;zood&quot; 或 &quot;food&quot;。 </p>
<p>[xyz] 字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 &quot;plain&quot; 中的 'a'。 </p>
<p>[^xyz] 负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 &quot;plain&quot; 中的'p'。 </p>
<p>[a-z] 字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 </p>
<p>[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 </p>
<p>\b 匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配&quot;never&quot; 中的 'er'，但不能匹配 &quot;verb&quot; 中的 'er'。 </p>
<p>\B 匹配非单词边界。'er\B' 能匹配 &quot;verb&quot; 中的 'er'，但不能匹配 &quot;never&quot; 中的 'er'。 </p>
<p>\cx 匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 </p>
<p>\d 匹配一个数字字符。等价于 [0-9]。 </p>
<p>\D 匹配一个非数字字符。等价于 [^0-9]。 </p>
<p>\f 匹配一个换页符。等价于 \x0c 和 \cL。 </p>
<p>\n 匹配一个换行符。等价于 \x0a 和 \cJ。 </p>
<p>\r 匹配一个回车符。等价于 \x0d 和 \cM。 </p>
<p>\s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 </p>
<p>\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 </p>
<p>\t 匹配一个制表符。等价于 \x09 和 \cI。 </p>
<p>\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 </p>
<p>\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 </p>
<p>\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 </p>
<p>\xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， '\x41' 匹配 &quot;A&quot;。'\x041' 则等价于 '\x04' &amp; &quot;1&quot;。正则表达式中可以使用 ASCII 编码。. </p>
<p>\num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。 </p>
<p>\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 </p>
<p>\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。 </p>
<p>\nml 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 </p>
<p>\un 匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。 </p>
<p><span style="FONT-SIZE: 18pt">优先权顺序</span> <br />
在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先权顺序来求值。 </p>
<p>下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>操作符&nbsp;描述&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>\&nbsp;转义符&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>(),&nbsp;(?:),&nbsp;(?=),&nbsp;[]&nbsp;圆括号和方括号&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>*,&nbsp;+,&nbsp;?,&nbsp;{n},&nbsp;{n,},&nbsp;{n,m}&nbsp;限定符&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>^,&nbsp;$,&nbsp;\anymetacharacter&nbsp;位置和顺序&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>|&nbsp;&ldquo;或&rdquo;操作&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>普通字符</p>
<p>普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。 </p>
<p>最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>/a/ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>/</span><span class="number">7</span><span>/ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>/M/ &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
等价的 VBScript 单字符正则表达式为： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="string">&quot;a&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="string">&quot;7&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="string">&quot;M&quot;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的 JScript 正则表达式不是别的，就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。
<p>&nbsp;</p>
<p>/a7M/ <br />
等价的 VBScript 表达式为：</p>
<p>&quot;a7M&quot; <br />
请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。</p>
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/52961#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Feb 2007 16:11:28 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/52961</link>
        <guid>http://bbx.javaeye.com/blog/52961</guid>
      </item>
      <item>
        <title>Dave 喜欢 Rails 的十大理由</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/52299" style="color:red;">http://bbx.javaeye.com/blog/52299</a>&nbsp;
          发表时间: 2007年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="tpc_content" id="a_ajax_231"><font color="#b22222"><font size="5"><font face="黑体">1.将敏捷带到了web开发中<br />
2.我也可以－－像那些酷小孩们一样－－创建优美的web页面<br />
3.它让我专注于&ldquo;如何创建应用程序&rdquo;，而不是&ldquo;如何玩一个框架&rdquo;<br />
4.尽管应用程序不断成长，也会一直保持可维护性<br />
5.对于客户不断提出的新要求，我可以更多地说 &ldquo;Yes&rdquo;<br />
6.测试是内建的（并且很简单），因此我们可以更频繁的进行测试<br />
7.即时的反馈：编辑代码，点击刷新按钮，就可以在浏览器看到变化<br />
8.元编程使我可以在很高的层面上编程<br />
9.代码生成让我能够更快的开始<br />
10.没有xml</font></font></font></span><br />
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/52299#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Feb 2007 14:08:57 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/52299</link>
        <guid>http://bbx.javaeye.com/blog/52299</guid>
      </item>
      <item>
        <title>Paginate a collection or an array</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/52293" style="color:red;">http://bbx.javaeye.com/blog/52293</a>&nbsp;
          发表时间: 2007年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          def paginate_collection(collection, options = {})<br />
&nbsp;&nbsp;&nbsp; default_options = {:per_page =&gt; 10, :page =&gt; 1}<br />
&nbsp;&nbsp;&nbsp; options = default_options.merge options<br />
&nbsp;&nbsp;&nbsp; pages = Paginator.new self, collection.size, options[:per_page], options[:page]<br />
&nbsp;&nbsp;&nbsp; first = pages.current.offset<br />
&nbsp;&nbsp;&nbsp; last = [first + options[:per_page], collection.size].min<br />
&nbsp;&nbsp;&nbsp; slice = collection[first...last]<br />
&nbsp;&nbsp;&nbsp; return [pages, slice]<br />
end<br />
<br />
The above snippet can be invoked using<br />
@pages, @users = paginate_collection User.find_custom_query, :page =&gt; @params[:page]<br />
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/52293#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Feb 2007 13:31:53 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/52293</link>
        <guid>http://bbx.javaeye.com/blog/52293</guid>
      </item>
      <item>
        <title>理解Ruby中的标志（Understanding Ruby Symbols）</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/52267" style="color:red;">http://bbx.javaeye.com/blog/52267</a>&nbsp;
          发表时间: 2007年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="tpc_content" id="a_ajax_198">原文出处：<a href="http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols" target="_blank">http://glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols</a> <br />
翻译：Suninny AT Gmail.com<br />
<br />
标志在Ruby中是一个迷。我们用她，但多数人并不真正懂她。 <br />
什么是标志？ <br />
简单来说，标志是你用来代表名字或字符串的一个东西。这可以归结为一种高效的描述名－－产生单一的字符串用于每个命名实例，这样就节省了空间。 <br />
琼斯博士的案例<br />
<br />
琼斯博士（Dr Jones）是个心理学家。 他通常使用语词联想试验诊断患者，并且使用Ruby记录一切。 他的第一名患者Why来到了这里：<br />
<br />
Dr J: Red <br />
Why : Ruby <br />
Dr J: Transportation <br />
Why : Rails <br />
Dr J: Chunky <br />
Why : Bacon<br />
<br />
琼斯博士建立一个散列来存储这些数据：<br />
<br />
　why = {&rdquo;red&rdquo; =&gt; &ldquo;ruby&rdquo;, &ldquo;transportation&rdquo; =&gt; &ldquo;rails&rdquo;, &ldquo;chunky&rdquo; =&gt; &ldquo;bacon&rdquo;}<br />
<br />
问题所在<br />
<br />
在进行几百个语词联想试验之后，琼斯博士开始意识到他用尽了内存! 于是琼斯在irb进行测试：<br />
<br />
&gt; patient1 = { &ldquo;ruby&rdquo; =&gt; &ldquo;red&rdquo; } <br />
&gt; patient2 = { &ldquo;ruby&rdquo; =&gt; &ldquo;programming&rdquo; } <br />
&gt; patient1.each_key {|key| puts key.object_id.to_s} <br />
211006 <br />
&gt; patient2.each_key {|key| puts key.object_id.to_s} <br />
203536<br />
<br />
我们看到，每次他建立一个散列来存储信息，Ruby就在不同的内存位置为每个键建立了一个新的字符串对象。<br />
<br />
幸运的是，我们还有其他的方法。<br />
<br />
用标志来突围<br />
<br />
不同于字符串，在一个Ruby会话期间，同一个名称的标志只作一次初始化然后就存在于内存中。当你需要重用字符串来表示其他东西时，标志是再适合不过的了。重做琼斯博士的测试，我们能直接观察到：<br />
<br />
&gt; patient1 = { :ruby =&gt; &ldquo;red&rdquo; } <br />
&gt; patient2 = { :ruby =&gt; &ldquo;programming&rdquo; } <br />
&gt; patient1.each_key {|key| puts key.object_id.to_s} <br />
3918094 <br />
&gt; patient2.each_key {|key| puts key.object_id.to_s} <br />
3918094<br />
<br />
通过使用标志，在语词联想试验中我们用单一的内存地址代表了&ldquo;ruby&rdquo;这个单词。随着时间的推移，这能节省下大量的空间。 <br />
标志的其他应用场合 <br />
无论何时，只要你是重用一个单词来反复代表其他东西，标志就能派上用场。不管是散列中的一个键，还是Http查询中的一个方法。在最新、最伟大的Web框架－－Ruby on Rails的路由和链接中就应用到了标志。<br />
<br />
在表现一个网页之前，Rails会执行框架内部的控制器（controllers）中定义的动作（actions），因此在Rails中，链接就像这样表示：<br />
<br />
link_to(&rdquo;View Article&rdquo;, :controller =&gt; &ldquo;articles&rdquo;, :action =&gt; &ldquo;show&rdquo;, :id =&gt; 1)<br />
<br />
当一个应用可能至少有数百个链接，或者说有数百个不同动作和控制器的引用时，使用标志就比使用字符串高效得多。<br />
<br />
最后，值得注意的是标志的应用场合并不局限于散列中的键。例如，如果你写一个Http客户端（或服务器），在这个程序中，可能需要多次用到get和post：<br />
<br />
do_this if query == :get<br />
<br />
&hellip; <br />
send_message_to_server(:post,filename)<br />
<br />
当需要反复用到一个字符串时，标志或许是一个蛮不错的替代品。<br />
<br />
更新 <br />
在Freenode（译注：一个著名的IRC服务器）的ruby-lang频道，Aria和Nome为这篇文章给出了有用的增补。<br />
<br />
11:58 &lt; Aria&gt; 同样，即便完全出于现实方面的考虑，使用标志也很理想：如果你要引用一个方法名，就用标志吧，因为她总会在那里（在定义了方法之后）。 <br />
12:03 &lt; nome&gt; Kevin Clark：标志的目的是用来辨别构造（主要是用户级的）：散列中的槽、一个方法、一个选项等等。<br />
<br />
同样，Aria还回应了Geoff在注解中提出的问题：<br />
<br />
Geoff：我很想知道1000个字符串&rdquo;red&rdquo;究竟要比:red耗费多少内存。记住，在Rails之外，&rdquo;red&rdquo; != :red<br />
<br />
Aria：多少内存？20字节/对象，加上存储数据的3个字节，再加上存储长度的4个字节，一共是27&times;1000＝27000个字节。与此相对，标志表条目的一份拷贝，只需几个字节。<br />
<br />
Jim Weirich 写到： <br />
我通常有下面的法则来比较字符串和标志： <br />
(1) 如果侧重于对象的内容（即字符序列），就用字符串； <br />
(2) 如果侧重于对象的身份，就用标志。</span><br />
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/52267#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Feb 2007 10:45:30 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/52267</link>
        <guid>http://bbx.javaeye.com/blog/52267</guid>
      </item>
      <item>
        <title>整合File-Column和Rmagick功能实现图片上传</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/52266" style="color:red;">http://bbx.javaeye.com/blog/52266</a>&nbsp;
          发表时间: 2007年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="tpc_content" id="a_ajax_188">在网站制作过程中，图片上传以及图片的大小调整是经常会用到的一个功能！<br />
<br />
Rails结合几个plug-in可以说很智能的做到了这一点<br />
<br />
做了一个简单的例子，系统在Windows平台上运行<br />
<br />
1.上网下载file-column-0.3.1.tar.gz 和rmagick-win32-1.13.0_IM-6.2.9-3.zip （我当前的最新版本，到下述站点下载 <a href="http://rubyforge.org/projects/rmagick/" target="_blank">http://rubyforge.org/projects/rmagick/</a> Linux下版本是RMagick-1.14.1.tar.gz）<br />
<br />
2.安装rmagick，执行zip包里面的exe文件，同时把安装路径放到path环境变量里面去，否则可能会报CORE_RL_magick_.dll找不到的错误<br />
<font color="#b22222">将压缩包中的gem文件copy到C:根目录下，然后执行<br />
&gt;gem install c:\rmagick-1.13.0-win32.gem</font><br />
3.安装file-column到app的vendor目录里，直接copy过去就行<br />
<br />
<br />
引用<br />
以下的文件配置基本上按照官方提供的sample来进行，算是用中文整合一下，谈不上原创<br />
<br />
4.建立一个存放路径的model，在数据库中建立Entry数据库 <br />
并生成相应的scaffold： <br />
ruby script/generate scaffold Entry upload<br />
<br />
4.修改model，并限制只能图片上传 <br />
<br />
<br />
代码<br />
class Entry &lt; ActiveRecord::Base &nbsp; <br />
validates_format_of :image, &nbsp; <br />
&nbsp; :with=&gt;/^.*(.jpg|.JPG|.gif|.GIF)$/, &nbsp; <br />
&nbsp; :message =&gt; &quot;你只能上传JPG或则GIF的图片文件&quot; <br />
file_column :image, :magick =&gt; { &nbsp; <br />
&nbsp; &nbsp; &nbsp; :versions =&gt; { &quot;thumb&quot; =&gt; &quot;50x50&quot;, &quot;medium&quot; =&gt; &quot;640x480&gt;&quot; } &nbsp; <br />
&nbsp; &nbsp; &nbsp; } &nbsp; <br />
end <br />
<br />
<br />
5.修改_form.rhtml <br />
<br />
<br />
代码<br />
&lt;%= error_messages_for 'entry' %&gt; <br />
<br />
&lt;!--[form:entry]--&gt; <br />
&lt;p&gt;&lt;label for=&quot;entry_image&quot;&gt;Image&lt;/label&gt;&lt;br/&gt; <br />
&lt;%= file_column_field 'entry', 'image' %&gt;&lt;/p&gt; <br />
&lt;!--[eoform:entry]--&gt; <br />
<br />
<br />
6.修改new.rhtml <br />
<br />
<br />
代码<br />
&lt;h1&gt;New entry&lt;/h1&gt; <br />
<br />
&lt;%= start_form_tag 'create',:multipart =&gt; true%&gt; <br />
&lt;%= render :partial =&gt; 'form' %&gt; <br />
&lt;%= submit_tag &quot;Create&quot; %&gt; <br />
&lt;%= end_form_tag %&gt; <br />
<br />
&lt;%= link_to 'Back', :action =&gt; 'list' %&gt; <br />
<br />
<br />
7.修改show.rhtml <br />
<br />
<br />
代码<br />
&lt;% for column in Entry.content_columns %&gt; <br />
&lt;p&gt; <br />
&lt;b&gt;&lt;%= column.human_name %&gt;:&lt;/b&gt; &lt;%=h @entry.send(column.name) %&gt; <br />
&lt;br&gt; <br />
原始大小： &nbsp; <br />
&lt;%= image_tag url_for_file_column 'entry', 'image' %&gt; <br />
&lt;br&gt; <br />
thumb: &nbsp; <br />
&lt;%= image_tag url_for_file_column 'entry', 'image' ,'thumb'%&gt; <br />
&lt;br&gt; <br />
medium: &nbsp; <br />
&lt;%= image_tag url_for_file_column 'entry', 'image' ,'medium'%&gt; <br />
&lt;/p&gt; <br />
&lt;% end %&gt; <br />
<br />
&lt;%= link_to 'Edit', :action =&gt; 'edit', :id =&gt; @entry %&gt; | &nbsp; <br />
&lt;%= link_to 'Back', :action =&gt; 'list' %&gt;<br />
<br />
但是有个问题，发现扩展名是大写时会出错<br />
<br />
解决办法：<br />
<br />
vendor\plugins\file-column-0.3.1\lib下file_column.rb文件<br />
<br />
里的<br />
<br />
#FileUtils.mv(local_file_path, new_local_file_path) unless new_local_file_path == local_file_path<br />
#modified by victor;<br />
FileUtils.mv(local_file_path, new_local_file_path) unless new_local_file_path.downcase == local_file_path.downcase <br />
<br />
<br />
<br />
改成如上即可</span><br />
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/52266#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Feb 2007 10:31:06 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/52266</link>
        <guid>http://bbx.javaeye.com/blog/52266</guid>
      </item>
      <item>
        <title>FCKEditor与rails的集成</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/52265" style="color:red;">http://bbx.javaeye.com/blog/52265</a>&nbsp;
          发表时间: 2007年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="tpc_content" id="a_ajax_113"><a href="http://www.blogjava.net/rocky/archive/2006/11/04/rails-fckeditor-integration.html" target="_blank">http://www.blogjava.net/rocky/archive/2006/11/04/rails-fckeditor-integration.html</a><br />
<br />
1.下载fckeditor_plugin-0.3.2.zip，目前版本为0.3.2<br />
2.解压到vendorplugins目录下，并且重新命名为fckeditor<br />
3.到该应用程序根目录下，然后运行rake fckeditor:install，则执行自动安装<br />
4.在自己的view层中添加<br />
<!--javascript_include_tag :fckeditor--><br />
以及在你需要编辑的字段textarea替换为<br />
<!--fckeditor_textarea("book", "desc", { :toolbarKit => 'Simple', :width => '100%', :height => '200px' })--><br />
第一个参数为你的domain对象，desc为你的编辑字段值，其他顾名思义<br />
然后运行你的页面程序，发现simple upload有点bug，上传后javascript报错<br />
5.追踪代码发现<br />
vendorplugins ckeditorappcontrollers ckeditor_controller.rb下的<br />
<br />
def upload<br />
&nbsp; self.upload_file<br />
end调用了upload_file方法<br />
def upload_file<br />
&nbsp; @new_file = params[:NewFile]<br />
&nbsp; @url = upload_directory_path<br />
&nbsp; begin<br />
&nbsp; &nbsp; ftype = @new_file.content_type.strip<br />
&nbsp; &nbsp; if ! MIME_TYPES.include?(ftype)<br />
&nbsp; &nbsp; &nbsp; @errorNumber = 202<br />
&nbsp; &nbsp; &nbsp; puts &quot;#{ftype} is invalid MIME type&quot;<br />
&nbsp; &nbsp; &nbsp; raise &quot;#{ftype} is invalid MIME type&quot;<br />
&nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; path = current_directory_path + &quot;/&quot; + @new_file.original_filename<br />
&nbsp; &nbsp; &nbsp; File.open(path,&quot;wb&quot;,0664) do |fp|<br />
&nbsp; &nbsp; &nbsp; FileUtils.copy_stream(@new_file, fp)<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; @errorNumber = 0<br />
&nbsp; &nbsp; end<br />
&nbsp; rescue =&gt; e<br />
&nbsp; &nbsp; @errorNumber = 110 if @errorNumber.nil?<br />
&nbsp; end<br />
&nbsp; <br />
&nbsp; # Fix provided by Nicola Piccinini -- <a href="http://superfluo.org/" target="_blank">http://superfluo.org</a><br />
&nbsp; render :text =&gt; %Q'<script>window.parent.frames['frmUpload'].OnUploadCompleted(#{@errorNumber});</script>'<br />
&nbsp; #render :inline =&gt; 'page &lt;&lt; &quot;window.parent.frames['frmUpload'].OnUploadCompleted(#{@errorNumber}, '#{@new_file}');&quot;', :type =&gt; :rjs<br />
end中的<br />
render :text =&gt; %Q'<script>window.parent.frames['frmUpload'].OnUploadCompleted(#{@errorNumber});</script>'在浏览服务器时是正常的，但是在快速上传中不应该返回这个script语句<br />
则修改upload方法<br />
def upload<br />
&nbsp; @new_file = params[:NewFile]<br />
&nbsp; @url = upload_directory_path<br />
&nbsp; begin<br />
&nbsp; &nbsp; ftype = @new_file.content_type.strip<br />
&nbsp; &nbsp; if ! MIME_TYPES.include?(ftype)<br />
&nbsp; &nbsp; &nbsp; @errorNumber = 202<br />
&nbsp; &nbsp; &nbsp; puts &quot;#{ftype} is invalid MIME type&quot;<br />
&nbsp; &nbsp; &nbsp; raise &quot;#{ftype} is invalid MIME type&quot;<br />
&nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; path = current_directory_path + &quot;/&quot; + @new_file.original_filename<br />
&nbsp; &nbsp; &nbsp; File.open(path,&quot;wb&quot;,0664) do |fp|<br />
&nbsp; &nbsp; &nbsp; FileUtils.copy_stream(@new_file, fp)<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; @errorNumber = 0<br />
&nbsp; &nbsp; end<br />
&nbsp; rescue =&gt; e<br />
&nbsp; &nbsp; @errorNumber = 110 if @errorNumber.nil?<br />
&nbsp; end<br />
&nbsp; <br />
&nbsp; # Fix provided by Nicola Piccinini -- <a href="http://superfluo.org/" target="_blank">http://superfluo.org</a><br />
&nbsp; render :text =&gt; %Q'<script>window.parent.OnUploadCompleted(#{@errorNumber},"#{UPLOADED}/#{params[:Type]}","#{@new_file.original_filename}","");</script>'<br />
end快速上传问题修复<br />
<br />
6.发现文件夹里边如果上传图片过多不好备份，故采用/年/月方式保存<br />
修改代码如下：<br />
&nbsp; def upload<br />
&nbsp; @new_file = params[:NewFile]<br />
&nbsp; @url = upload_directory_path<br />
&nbsp; begin<br />
&nbsp; &nbsp; ftype = @new_file.content_type.strip<br />
&nbsp; &nbsp; if ! MIME_TYPES.include?(ftype)<br />
&nbsp; &nbsp; &nbsp; @errorNumber = 202<br />
&nbsp; &nbsp; &nbsp; puts &quot;#{ftype} is invalid MIME type&quot;<br />
&nbsp; &nbsp; &nbsp; raise &quot;#{ftype} is invalid MIME type&quot;<br />
&nbsp; &nbsp; else<br />
&nbsp; &nbsp; &nbsp; path = date_directory_path + &quot;/&quot; + @new_file.original_filename<br />
&nbsp; &nbsp; &nbsp; File.open(path,&quot;wb&quot;,0664) do |fp|<br />
&nbsp; &nbsp; &nbsp; FileUtils.copy_stream(@new_file, fp)<br />
&nbsp; &nbsp; &nbsp; end<br />
&nbsp; &nbsp; &nbsp; @errorNumber = 0<br />
&nbsp; &nbsp; end<br />
&nbsp; rescue =&gt; e<br />
&nbsp; &nbsp; @errorNumber = 110 if @errorNumber.nil?<br />
&nbsp; end<br />
&nbsp; <br />
&nbsp; # Fix provided by Nicola Piccinini -- <a href="http://superfluo.org/" target="_blank">http://superfluo.org</a><br />
&nbsp; render :text =&gt; %Q'<script>window.parent.OnUploadCompleted(#{@errorNumber},"#{UPLOADED}/#{params[:Type]}/#{Time.now.year}/#{Time.now.month}/#{@new_file.original_filename}","#{@new_file.original_filename}","");</script>'<br />
end <br />
private<br />
def date_directory_path<br />
&nbsp; base_dir = &quot;#{UPLOADED_ROOT}/#{params[:Type]}/#{Time.now.year}/#{Time.now.month}&quot;<br />
&nbsp; #Dir.mkdir(base_dir,0775) unless File.exists?(base_dir)<br />
&nbsp; FileUtils.mkdir_p base_dir<br />
&nbsp; &quot;#{base_dir}&quot;<br />
end<br />
7.同理可以对其上传文件名称进行随机处理以防重名，就不多说了。<br />
做此笔记，抛砖引玉。<br />
<br />
发现rails的plugin机制挺不错的，比较灵活，不过网上介绍plugin的文章真的不是很多</span><br />
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/52265#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Feb 2007 10:28:45 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/52265</link>
        <guid>http://bbx.javaeye.com/blog/52265</guid>
      </item>
      <item>
        <title>Rails中文问题解决方法</title>
        <author>koska</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bbx.javaeye.com">koska</a>&nbsp;
          链接：<a href="http://bbx.javaeye.com/blog/52263" style="color:red;">http://bbx.javaeye.com/blog/52263</a>&nbsp;
          发表时间: 2007年02月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span class="tpc_content" id="a_ajax_2">1.在radrails中，请在project的property对话框中，左边选中info节点，右边设置编码方式为UTF-8 <br />
<br />
2.修改MySQL的配置文件C:\Program Files\MySQL\MySQL Server 5.0\my.ini，改其中的两处default-character-set=utf8,改完后重启MySQL(windows服务)。这一步也可采用instance wizard来做。 <br />
<br />
3.运行你的建库脚本,建库脚本中无须涉及到任何编码问题。 <br />
<br />
4. 修改ApplicationController 如下: <br />
<br />
class ApplicationController &lt; ActionController::Base <br />
&nbsp; before_filter :configure_charsets <br />
&nbsp; &nbsp; def configure_charsets <br />
&nbsp; &nbsp; &nbsp; # @headers[&quot;Content-Type&quot;] = &quot;text/html; charset=utf-8&quot; <br />
&nbsp; &nbsp; &nbsp; @response.headers[&quot;Content-Type&quot;] = &quot;text/html; charset=utf-8&quot; <br />
&nbsp; &nbsp; &nbsp; # Set connection charset. MySQL 4.0 doesn??t support this so it <br />
&nbsp; &nbsp; &nbsp; #will throw an error, MySQL 4.1 needs this <br />
&nbsp; &nbsp; &nbsp; suppress(ActiveRecord::StatementInvalid) do <br />
&nbsp; &nbsp; &nbsp; ActiveRecord::Base.connection.execute 'SET NAMES utf8' <br />
&nbsp; &nbsp; end <br />
&nbsp; end <br />
end <br />
<br />
5.请在rhtml中，或者适当的layout中，加上: <br />
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot;&gt; <br />
<br />
至此，无论是在Mysql中，前台页面中，还是在IDE中，都能正常使用中文 <br />
<br />
6.关于ruby本身的中文字串处理问题，例如size,substring等，请查看此文 <br />
<a href="http://www.blogjava.net/cap/archive/2006/12/14/87830.html" target="_blank">http://www.blogjava.net/cap/archive/2006/12/14/87830.html</a></span><br />
</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://bbx.javaeye.com/blog/52263#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Feb 2007 10:25:54 +0800</pubDate>
        <link>http://bbx.javaeye.com/blog/52263</link>
        <guid>http://bbx.javaeye.com/blog/52263</guid>
      </item>
  </channel>
</rss>