存档:2007年八月

C#正则

八月 17, 2007 | c/c++ | RSS 2.0

正则1.确认有效电子邮件格式 

  下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 IsValidEmail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前,筛选出包含无效字符的电子邮件地址。 

[Visual Basic] 
Function IsValidEmail(strIn As String) As Boolean 
‘ Return true if strIn is in valid e-mail format. 
Return Regex.IsMatch(strIn, (”^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$”) 
End Function 

[C#] 
bool IsValidEmail(string strIn) 

// Return true if strIn is in valid e-mail format. 
return Regex.IsMatch(strIn, @”^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$”); 

  2.清理输入字符串 

  下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-(连字符)和 .(句点)以外的所有非字母数字字符后返回一个字符串。 

[Visual Basic] 
Function CleanInput(strIn As String) As String 
‘ Replace invalid characters with empty strings. 
Return Regex.Replace(strIn, ”[^w.@-]“, ”") 
End Function 

[C#] 
String CleanInput(string strIn) 

// Replace invalid characters with empty strings. 
return Regex.Replace(strIn, @”[^w.@-]“, ”"); 

  3.更改日期格式 

  以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。 

[Visual Basic] 
Function MDYToDMY(input As String) As String 
Return Regex.Replace(input, _ 
“b(?d{1,2})/(?d{1,2})/(?d{2,4})b”, _ 
“${day}-${month}-${year}”) 
End Function 

[C#] 
String MDYToDMY(String input) 

return Regex.Replace(input, 
“b(?d{1,2})/(?d{1,2})/(?d{2,4})b”, 
“${day}-${month}-${year}”); 

  Regex 替换模式 

  本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达式 ${day} 插入由 (?…) 组捕获的子字符串。 

  有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便 

  4.提取 URL 信息 

  以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如,“http://www.contoso.com:8080/letters/readme.html”将返回“http:8080”。 

[Visual Basic] 
Function Extension(url As String) As String 
Dim r As New Regex(”^(?w+)://[^/]1.确认有效电子邮件格式 

  下面的代码示例使用静态 Regex.IsMatch 方法验证一个字符串是否为有效电子邮件格式。如果字符串包含一个有效的电子邮件地址,则 IsValidEmail 方法返回 true,否则返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在应用程序将地址存储在数据库中或显示在 ASP.NET 页中之前,筛选出包含无效字符的电子邮件地址。 

[Visual Basic] 
Function IsValidEmail(strIn As String) As Boolean 
‘ Return true if strIn is in valid e-mail format. 
Return Regex.IsMatch(strIn, (”^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$”) 
End Function 

[C#] 
bool IsValidEmail(string strIn) 

// Return true if strIn is in valid e-mail format. 
return Regex.IsMatch(strIn, @”^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$”); 

  2.清理输入字符串 

  下面的代码示例使用静态 Regex.Replace 方法从字符串中抽出无效字符。您可以使用这里定义的 CleanInput 方法,清除掉在接受用户输入的窗体的文本字段中输入的可能有害的字符。CleanInput 在清除掉除 @、-(连字符)和 .(句点)以外的所有非字母数字字符后返回一个字符串。 

[Visual Basic] 
Function CleanInput(strIn As String) As String 
‘ Replace invalid characters with empty strings. 
Return Regex.Replace(strIn, ”[^w.@-]“, ”") 
End Function 

[C#] 
String CleanInput(string strIn) 

// Replace invalid characters with empty strings. 
return Regex.Replace(strIn, @”[^w.@-]“, ”"); 

  3.更改日期格式 

  以下代码示例使用 Regex.Replace 方法来用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。 

[Visual Basic] 
Function MDYToDMY(input As String) As String 
Return Regex.Replace(input, _ 
“b(?d{1,2})/(?d{1,2})/(?d{2,4})b”, _ 
“${day}-${month}-${year}”) 
End Function 

[C#] 
String MDYToDMY(String input) 

return Regex.Replace(input, 
“b(?d{1,2})/(?d{1,2})/(?d{2,4})b”, 
“${day}-${month}-${year}”); 

  Regex 替换模式 

  本示例说明如何在 Regex.Replace 的替换模式中使用命名的反向引用。其中,替换表达式 ${day} 插入由 (?…) 组捕获的子字符串。 

  有几种静态函数使您可以在使用正则表达式操作时无需创建显式正则表达式对象,而 Regex.Replace 函数正是其中之一。如果您不想保留编译的正则表达式,这将给您带来方便 

  4.提取 URL 信息 

  以下代码示例使用 Match.Result 来从 URL 提取协议和端口号。例如,“http://www.contoso.com:8080/letters/readme.html”将返回“http:8080”。 

[Visual Basic] 
Function Extension(url As String) As String 
Dim r As New Regex(”^(?w+)://[^/]+?(?:d+)?/”, _ 
RegexOptions.Compiled) 
Return r.Match(url).Result(”${proto}${port}”) 
End Function 

[C#] 
String Extension(String url) 

Regex r = new Regex(@”^(?w+)://[^/]+?(?:d+)?/”, 
RegexOptions.Compiled); 
return r.Match(url).Result(”${proto}${port}”); 
} +?(?:d+)?/”, _ 
RegexOptions.Compiled) 
Return r.Match(url).Result(”${proto}${port}”) 
End Function 

[C#] 
String Extension(String url) 

Regex r = new Regex(@”^(?w+)://[^/]+?(?:d+)?/”, 
RegexOptions.Compiled); 
return r.Match(url).Result(”${proto}${port}”); 

没有评论 »

八月 16, 2007 | 心情杂记 | RSS 2.0

     搞计算机一个累!!

    这几天正则把我的头都搞大了!做个小偷程序准备!

    然后回家

没有评论 »

练习正则

八月 14, 2007 | js/web, php, 数据结构算法 | RSS 2.0

<?
/*****************************************************
* Copyright     : [url]www.blog.163.com/liufabin66688[/url]
* FileName      : check
* Author        : 刘发宾
* NickName      : 小和尚
* Version       : v1.0
* Description   :验证
* CreatDate     : 2007-7
* HistoryEdit   : 历史修改记录
———- 第一次修改 ——————-     
        Author  :
        Date    :
        Summary :
————–  ————————     
*****************************************************/
class check
{
  /*
   @param:$str;
   @param:return,$str;
   return : $str;
   function :clear space
  */
  function trimstr($str)
  {
  if(strlen($str<1) return false;
  $str=preg_replace(”/(  | ){1,}/ “,”",$str);//替换全角
  return $str;
  }
    /*
   @param:$str;
   @param:$min;
   @param:$max
   @param:$type
   return bool
   function :check user
  */
  function CheckUser($str,$min=1,$max=20,$type=”$ENCN”)
  {
  trimstr($str);
  if(strlen($str)>$max||strlen($str)<$min) return false;
  switch($type)
    {
 case “EN”://英文
    return preg_match(”/^[a-zA-Z]+$/”,$str);
    break;
 case “ENNUM”://英文数字
  
    return preg_match(”/^[w]+$/”,$str);
    break;
  case “CN”://匹配中文
      return preg_match(”/^[x80-xff]+$/”,$str);
   break;
  case “ALL”://数字字母空格中文
    return preg_match(’/[x80-xff]*[x20]*[x30-x39]*[x41-x5a,x61-x7a]*/’,$str);
    break;
     
     default : return false;
    }
 
 
  }
  /*
  @param:$str;
  @param:$min;
  @param:$max;
  return :bool
  function:check password
  */
  function CheckPassword($str,$min=1,$max=20)
  {
    trimstr($str);
    if(strlen($str)>$max||strlen($str)<$min) return false;
 return preg_match(’/^[_w]+$/’);

 
  }
  /*
  @param:$str;
  @param:$type
  return :bool
  function :check telephone
  */
  function CheckTelePhone ($str,$type=”PH”)
  {
   trimstr($str);
   switch($type)
    {
 case “PH”: //普通电话
   return preg_match(’/^([0-9]{3}|0[0-9]{3})-[0-9]{7,8}$/’),$str);break;
 
 case “MO”:
    return preg_match(’/^(13[0-9])|159[0-9]{8}$/’),$str);break;
   
  default return false;
 }
 
  }
   /*
  @param:$str;
  @param:$type
  return :bool
  function :check time
  */
 function CheckTime($str,$type=”yyyy-mm-dd”)
 {
  trimstr(str);
  strtolower($type);
  switch($type)
  {
   case “yyyy-mm-dd”:
     $part=explode(”-”,$str);
  return checkdate($part[1],$part[2],$part[0]);
  break;
   case “yyyy/mm/dd”:
     $part=explode(”/”,$str);
  return checkdate($part[1],$part[2],$part[0]);
     break;
   case “ALL”:
    return preg_match(’/[d]{4}|[d][2][w]{1}[d]{1,2}[w][d]{1,2}[w]{0,4}/’);
   default $pattern = ‘/[d]{4}-[d]{1,2}-[d]{1,2}s[d]{1,2}:[d]{1,2}:[d]{1,2}/’;
    return preg_match($pattern, $time);
  }
 
 
 
 }
  /*
  @param:$str;
   return :bool
  function :check email
  */
 function CheckEmail($str)
{
return preg_match(’/([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)/’, $str);
 }
 /*
 @param:$str;
 return bool
 function: check url
 */
function CheckUrl($str)
{
return preg_match(’http://[w]+’,$str);

}

 

 

 

 

}

 

 

 

 

 

 

 


?> <?
 function  regex_play($in_strings,$in_regex)
 {
  if(!is_array($in_strings)||!is_string($in_regex))
  die(’bad parameters(array+string)</br>’);

  foreach($in_strings as $x=>$strval)
  {
  $found=ereg($in_regex,$strval,$matches);
  if($found)
  {
  echo “Array Index <b> $x</b>matches”;
  var_export($matches); echo “”$strval”<br/>”;
  
  }
  
  }
  
 echo “<br/1>”; 
 }
 
 
 
 
 
 $clothes=array(”shoes”,”pants”,”socks”,”jacket”,”cardigan”,”scarf”,”t-shirt”,”blouse”,”underpants”,”belt”,” hand bag”);
regex_play($clothes,’s$’);
 
 regex_play(array(”loser”,”looser”,”lser”,”looooser”),’lo{2,8}se’);
 $valid=ereg(”sgwgegdd”,’[[:alnum:]_-]{8,50}’);
 //if($ )
 echo ereg_replace(’shoe’,'cat’,'i like shoes and shoes like me’);
 echo ereg_replace(’$[0-9]+(.[0-9]{1,2})?’,'(lots of monery)’,'jony is paid $1500232.557 each yere’);
 echo “Preg_replace used time:”;
$start = time();
for($i=1;$i<=100;$i++) {
$str = “ssssssssssssssssssssssssssss”;
preg_replace(”/s/”,”",$str);
}
$ended = time()-$start;
echo $ended;
echo ”
ereg_replace used time:”;
$start = time();
for($i=1;$i<=100;$i++) {
$str = “ssssssssssssssssssssssssssss”;
ereg_replace(”s”,”",$str);
}
$ended = time()-$start;
echo $ended;
echo ”
str_replace used time:”;
$start = time();
for($i=1;$i<=100;$i++) {
$str = “sssssssssssssssssssssssssssss”;
str_replace(”s”,”",$str);
}
$ended = time()-$start;
echo $ended;
$str = “中文测试”;
preg_match_all(”/([x81-xfe][x40-xfe])/”, $str, $ch);
$patterns = array_unique($ch[0]);
print_r($patterns);
if (preg_match (”/php/i”, “PHP is the web scripting language of choice.”)) {
    print “A match was found.”;
} else {
    print “A match was not found.”;
}
/* 模式中的 b 表示单词的边界,因此只有独立的 “web” 单词会被匹配,
 * 而不会匹配例如 “webbing” 或 “cobweb” 中的一部分 */
if (preg_match (”/bwebb/i”, “PHP is the web scripting language of choice.”)) {
    print “A match was found.”;
} else {
    print “A match was not found.”;
}

if (preg_match (”/bwebb/i”, “PHP is the website scripting language of choice.”)) {
    print “A match was found.”;
} else {
    print “A match was not found.”;
}
preg_match(”/^(http://)?([^/]+)/i”,
    “http://www.php.net/index.html“, $matches);
$host = $matches[2];

//echo $host;
var_dump($matches);
preg_match(”/[^./]+.[^./]+$/”, $host, $matches);
echo “domain name is: {$matches[0]}”;

$lstr=’<a href=”http://ent.tom.com/1306/1310/2006627-197372.html” target=”_blank” class=list>妮可凯斯新婚牵手秀恩爱</a><br>
<a href=”http://ent.tom.com/1306/1362/2006627-197463.html” target=”_blank” class=list>传古巨基私下捞钱被雪藏</a> <a href=”http://ent.tom.com/1306/1362/2006627-197407.html” target=”_blank” class=list>传何炅孙国庆大打出手</a><br>
<a href=”http://ent.tom.com/1030/1565/2006627-197453.html” target=”_blank”>郝菲尔:早料到被淘汰</a> <a href=”http://ent.tom.com/1306/1362/2006627-197398.html” target=”_blank”>范冰冰”眼角整容图”曝光</a></td></tr>
</table>’;
if(preg_match_all(”/http://[a-zA-Z0-9][a-zA-Z0-9/._-]+[.html]/”,$lstr,$matches))
  foreach ($matches[0] as $url)
  echo $url.’<br>’;
else
  echo ‘没有合适’;
?>

 

没有评论 »

最大子序列算法理解分治

八月 12, 2007 | 数据结构算法 | RSS 2.0

今天继续算法的复习,贴出最大子序列算法,简单的如几层for的就省了

一个应用分治,一个应用线形

/*****************************************************
* Copyright     : [url]www.blog.163.com/liufabin66688[/url]
* FileName      : ****.sln
* Author        : 刘发宾
* NickName      : 小和尚
* Version       : v1.0
* Description   : 两种优化的最大子序列算法
* CreatDate     : 2007-8
* HistoryEdit   : 历史修改记录
———- 第一次修改 ——————-     
        Author  :
        Date    :
        Summary :
————–  ————————     
*****************************************************/

using System;
using System.Collections.Generic;
using System.Text;

namespace xulie
{
    class Program
    {
        private static int maxSumRec(int[] a, int left, int right)
        {
            if (left == right)//就一个数
            {
                if (a[left] > 0)
                    return a[left];
            }
            else
                return 0;
       
     
        int center=(left+right)/2;
        int maxLeftSum=maxSumRec(a,left,center);
        int maxRightSum=maxSumRec(a,center+1,right);
        int maxLeftBorderSum = 0, leftBorderSum = 0;
        for(int i=center;i>=left;i–)
         {
          leftBorderSum+=a[i];
          if(leftBorderSum>maxLeftBorderSum)
              {
                maxLeftBorderSum=leftBorderSum;
               }
         }
         int maxRightBorderSum=0,rightBorderSum=0;
          for(int i=center+1;i<right;i++)
              {
               rightBorderSum+=a[i];
               if(rightBorderSum>maxRightBorderSum)
                {

                  maxRightBorderSum=rightBorderSum;
                  }
               }
            int all=maxLeftBorderSum + maxRightBorderSum;
               return max3(ref maxLeftSum,ref maxRightSum, ref  all);
             }
        public static int max3(ref int a,ref  int b,ref  int c)
        {
        int max=0;
        if (a > b)
        {
            max = a;
        }
        else{
          max=b;
          }
          if (max < c)
          {
              return c;
          }
          else {
              return max;
            }

        }
        static void Main(string[] args)
        {
            int[] a ={ 2,66};
            foreach (int i in a)
            {
                Console.Write(i.ToString());
           
            }
           Console.Write( maxSumRec(a,0,a.Length).ToString());
           Console.Read();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        public static int maxSubSum4(int[] a)
        {

            int maxSum = 0, thisSum = 0;
            for (int j = 0; j < a.Length; j++)
            {
            thisSum+=a[j];
           
          
            if (thisSum > maxSum)
                maxSum = thisSum;
            else if (thisSum < 0)
                thisSum = 0;
         }
         return maxSum;
        }
        static void Main(string[] args)
        {

            int[] a ={ 43,-44,6,3,-4,-35,55,3};
           
            Console.Write(maxSubSum4(a).ToString());
            Console.Read();

        }
    }
}

没有评论 »

优美的英文

八月 9, 2007 | 心情杂记 | RSS 2.0

   最近一直搞那个东西,所以没时间学习设计模式啊,数据结构啊,算法分析.最近发现听着歌曲,编写程序是一种享受!尤其是学友和beyond 的!贴出

一篇:A Grain of Sand
一粒沙子
    William Blake/威廉.布莱克
To see a world in a grain of sand,
And a heaven in a wild fllower,
Hold infinity in the palm of your hand,
And eternity in an hour.
从一粒沙子看到一个世界,
从一朵野花看到一个天堂,
把握在你手心里的就是无限,
永恒也就消融于一个时辰。

第二篇:Love Your Life
 热爱生活
    Henry David Thoreau/享利.大卫.梭罗
However mean your life is,meet it and live it ;do not shun it and call it hard names.It is not so bad as you are.It looks poorest when you are richest.The fault-finder will find faults in paradise.Love your life,poor as it is.You may perhaps have some pleasant,thrilling,glorious hourss,even in a poor-house.The setting sun is reflected from the windows of the alms-house as brightly as from the rich man’s abode;the snow melts before its door as early in the spring.I do not see but a quiet mind may live as contentedly there,and have as cheering thoughts,as in a palace.The town’s poor seem to me often to live the most independent lives of any.May be they are simply great enough to receive without misgiving.Most think that they are above being supported by the town;but it often happens that they are not above supporting themselves by dishonest means.which should be more disreputable.Cultivate poverty like a garden herb,like sage.Do not trouble yourself much to get new things,whether clothes or friends,Turn the old,return to them.Things do not change;we change.Sell your clothes and keep your thoughts.

不论你的生活如何卑贱,你要面对它生活,不要躲避它,更别用恶言咒骂它。它不像你那样坏。你最富有的时候,倒是看似最穷。爱找缺点的人就是到天堂里也能找到缺点。你要爱你的生活,尽管它贫穷。甚至在一个济贫院里,你也还有愉快、高兴、光荣的时候。夕阳反射在济贫院的窗上,像身在富户人家窗上一样光亮;在那门前,积雪同在早春融化。我只看到,一个从容的人,在哪里也像在皇宫中一样,生活得心满意足而富有愉快的思想。城镇中的穷人,我看,倒往往是过着最独立不羁的生活。也许因为他们很伟大,所以受之无愧。大多数人以为他们是超然的,不靠城镇来支援他们;可是事实上他们是往往利用了不正当的手段来对付生活,他们是毫不超脱的,毋宁是不体面的。视贫穷如园中之花而像圣人一样耕植它吧!不要找新的花样,无论是新的朋友或新的衣服,来麻烦你自己。找旧的,回到那里去。万物不变,是我们在变。你的衣服可以卖掉,但要保留你的思想。

第三篇:

The pure.the bright,the beautiful, 一切纯洁的,辉煌的,美丽的,
That stirred our hearts in youth, 强烈地震撼着我们年轻的心灵的,
The impulses to wordless prayer, 推动着我们做无言的祷告的,
The dreams of love and truth; 让我们梦想着爱与真理的;
The longing after something’s lost, 在失去后为之感到珍惜的,
The spirit’s yearning cry, 使灵魂深切地呼喊着的,
The striving after better hopes- 为了更美好的梦想而奋斗着的-
These things can never die. 这些美好不会消逝。

The timid hand stretched forth to aid 羞怯地伸出援助的手,
A brother in his need, 在你的弟兄需要的时候,
A kindly word in grief’s dark hour 伤恸、困难的时候,一句亲切的话
That proves a friend indeed ; 就足以证明朋友的真心;
The plea for mercy softly breathed, 轻声地乞求怜悯,
When justice threatens nigh, 在审判临近的时候,
The sorrow of a contrite heart- 懊悔的心有一种伤感–
These things shall never die. 这些美好不会消逝。

Let nothing pass for every hand 在人间传递温情
Must find some work to do ; 尽你所能地去做;
Lose not a chance to waken love- 别错失去了唤醒爱的良机—–
Be firm,and just ,and true; 为人要坚定,正直,忠诚;
So shall a light that cannot fade 因此上方照耀着你的那道光芒
Beam on thee from on high. 就不会消失。
And angel voices say to thee—你将听到天使的声音在说—–
These things shall never die. 这些美好不会消逝。

第四篇

Think it over……好好想想……

Today we have higher buildings and wider highways,but shorter temperaments and narrower points of view;
今天我们拥有了更高层的楼宇以及更宽阔的公路,但是我们的性情却更为急躁,眼光也更加狭隘;

We spend more,but enjoy less;
我们消耗的更多,享受到的却更少;

We have bigger houses,but smaller famillies;
我们的住房更大了,但我们的家庭却更小了;

We have more compromises,but less time;
我们妥协更多,时间更少;

We have more knowledge,but less judgment;
我们拥有了更多的知识,可判断力却更差了;

We have more medicines,but less health;
我们有了更多的药品,但健康状况却更不如意;

We have multiplied out possessions,but reduced out values;
我们拥有的财富倍增,但其价值却减少了;

We talk much,we love only a little,and we hate too much;
我们说的多了,爱的却少了,我们的仇恨也更多了;

We reached the Moon and came back,but we find it troublesome to cross our own street and meet our neighbors;
我们可以往返月球,但却难以迈出一步去亲近我们的左邻右舍;

We have conquered the uter space,but not our inner space;
我们可以征服外太空,却征服不了我们的内心;

We have highter income,but less morals;
我们的收入增加了,但我们的道德却少了;

These are times with more liberty,but less joy;
我们的时代更加自由了,但我们拥有的快乐时光却越来越少;

We have much more food,but less nutrition;
我们有了更多的食物,但所能得到的营养却越来越少了;

These are the days in which it takes two salaries for each home,but divorces increase;
现在每个家庭都可以有双份收入,但离婚的现象越来越多了;

These are times of finer houses,but more broken homes;
现在的住房越来越精致,但我们也有了更多破碎的家庭;

That’s why I propose,that as of today;
这就是我为什么要说,让我们从今天开始;

You do not keep anything for a special occasion.because every day that you live is a SPECIAL OCCASION.
不要将你的东西为了某一个特别的时刻而预留着,因为你生活的每一天都是那么特别;

Search for knowledge,read more ,sit on your porch and admire the view without paying attention to your needs;
寻找更我的知识,多读一些书,坐在你家的前廊里,以赞美的眼光去享受眼前的风景,不要带上任何功利的想法;

Spend more time with your family and friends,eat your favorite foods,visit the places you love;
花多点时间和朋友与家人在一起,吃你爱吃的食物,去你想去的地方;

Life is a chain of moments of enjoyment;not only about survival;
生活是一串串的快乐时光;我们不仅仅是为了生存而生存;

Use your crystal goblets.Do not save your best perfume,and use it every time you feel you want it.
举起你的水晶酒杯吧。不要吝啬洒上你最好的香水,你想用的时候就享用吧!

Remove from your vocabulary phrases like”one of these days”or “someday”;
从你的词汇库中移去所谓的“有那么一天”或者“某一天”;

Let’s write that letter we thought of writing “one of these days”!
曾打算“有那么一天”去写的信,就在今天吧!

Let’s tell our families and friends how much we love them;
告诉家人和朋友,我们是多么地爱他们;

Do not delay anything that adds laughter and joy to your life;
不要延迟任何可以给你的生活带来欢笑与快乐的事情;

Every day,every hour,and every minute is special;
每一天、每一小时、每一分钟都是那么特别;

And you don’t know if it will be your last.
你无从知道这是否最后刻。

没有评论 »

带实例的php正则验证

八月 6, 2007 | php | RSS 2.0

PHP中的正则表达式函数
在PHP中有两套正则表达式函数库。一套是由PCRE(Perl Compatible Regular Expression)库提供的。PCRE库使用和Perl相同的语法规则实现了正则表达式的模式匹配,其使用以“preg_”为前缀命名的函数。另一套是由POSIX(Portable Operation System interface)扩展库提供的。POSIX扩展的正则表达式由POSIX 1003.2定义,一般使用以“ereg_”为前缀命名的函数。

两套函数库的功能相似,执行效率稍有不同。一般而言,实现相同的功能,使用PCRE库的效率略占优势。下面详细介绍其使用方法。

正则表达式的匹配
1.preg_match()
函数原型:int preg_match (string $pattern, string $content [, array $matches])

preg_match ()函数在$content字符串中搜索与$pattern给出的正则表达式相匹配的内容。如果提供了$matches,则将匹配结果放入其中。$matches[0]将包含与整个模式匹配的文本,$matches[1]将包含第一个捕获的与括号中的模式单元所匹配的内容,以此类推。该函数只作一次匹配,最终返回0或1的匹配结果数。代码6.1给出preg_match()函数的一段代码示例。

日期时间的匹配

<?php

     //需要匹配的字符串。date函数返回当前时间

     $content = “Current date and time is “.date(”Y-m-d h:i a”).”, we are learning PHP together.”;

     //使用通常的方法匹配时间

     if (preg_match (”/d{4}-d{2}-d{2} d{2}:d{2} [ap]m/”, $content, $m))

     {

        echo “匹配的时间是:” .$m[0]. “”;

     }

     //由于时间的模式明显,也可以简单的匹配

     if (preg_match (”/([d-]{10}) ([d:]{5} [ap]m)/”, $content, $m))

     {

         echo “当前日期是:” .$m[1]. “”;

         echo “当前时间是:” .$m[2]. “”;

     }

?>

这是一个简单动态文本串匹配实例。假设当前系统时间是“2006年8月17日13点25分”,将输出如下的内容。

匹配的时间是:2006-08-17 01:25 pm

当前日期是:2006-08-17

当前时间是:01:25 pm

2.ereg()和eregi()
ereg()是POSIX扩展库中正则表达式的匹配函数。eregi()是ereg()函数的忽略大小写的版本。二者与preg_match的功能类似,但函数返回的是一个布尔值,表明匹配成功与否。需要说明的是,POSIX扩展库函数的第一个参数接受的是正则表达式字符串,即不需要使用分界符。例如,代码6.2是一个关于文件名安全检验的方法。

文件名的安全检验

<?php

     $username = $_SERVER['REMOTE_USER'];

     $filename = $_GET['file'];

     //对文件名进行过滤,以保证系统安全

     if (!ereg(’^[^./][^/]*$’, $userfile))

     {

         die(’这不是一个非法的文件名!’);

     }

     //对用户名进行过滤

     if (!ereg(’^[^./][^/]*$’, $username))

     {

         die(’这不是一个无效的用户名’);

     }

               

     //通过安全过滤,拼合文件路径

     $thefile = “/home/$username/$filename”;

?>

通常情况下,使用与Perl兼容的正则表达式匹配函数perg_match(),将比使用ereg()或eregi()的速度更快。如果只是查找一个字符串中是否包含某个子字符串,建议使用strstr()或strpos()函数。

3.preg_grep()
函数原型:array preg_grep (string $pattern, array $input)

preg_grep()函数返回一个数组,其中包括了$input数组中与给定的$pattern模式相匹配的单元。对于输入数组$input中的每个元素,preg_grep()也只进行一次匹配。代码6.3给出的示例简单地说明了preg_grep()函数的使用。

数组查询匹配

<?php

     $subjects = array(

         “Mechanical Engineering”,   “Medicine”,

          “Social Science”,            “Agriculture”,

          “Commercial Science”,                           “Politics”

    );

               
     //匹配所有仅由有一个单词组成的科目名

     $alonewords = preg_grep(”/^[a-z]*$/i”, $subjects);

?>

进行全局正则表达式匹配
1.preg_match_all()
与preg_match()函数类似。如果使用了第三个参数,将把所有可能的匹配结果放入。本函数返回整个模式匹配的次数(可能为0),如果出错返回False。下面是一个将文本中的URL链接地址转换为HTML代码的示例。代码6.4是preg_match_all()函数的使用范例。

将文本中的链接地址转成HTML

<?php

     //功能:将文本中的链接地址转成HTML

     //输入:字符串

     //输出:字符串

     function url2html($text)

     {

         //匹配一个URL,直到出现空白为止

         preg_match_all(”/http://?[^s]+/i”, $text, $links);

         //设置页面显示URL地址的长度

         $max_size = 40;

         foreach($links[0] as $link_url)

         {

             //计算URL的长度。如果超过$max_size的设置,则缩短。

             $len = strlen($link_url);

             if($len > $max_size)

             {

                 $link_text = substr($link_url, 0, $max_size).”…”;

             } else {

                 $link_text = $link_url;

             }

             //生成HTML文字

             $text = str_replace($link_url,”<a href=’$link_url’>$link_text</a>”,$text);

         }

         return $text;

     }

               

     //运行实例

     $str = “这是一个包含多个URL链接地址的多行文字。欢迎访问http://www.taoboor.com”;

     print url2html($str);

     /*输出结果

        这是一个包含多个URL链接地址的多行文字。欢迎访问<a href=’http://www.taoboor.com’>
         http://www.taoboor.com</a>
     */

?>

2.多行匹配
仅仅使用POSIX下的正则表式函数,很难进行复杂的匹配操作。例如,对整个文件(尤其是多行文本)进行匹配查找。使用ereg()对此进行操作的一个方法是分行处理。代码6.5的示例演示了ereg()如何将INI文件的参数赋值到数组之中。

 文件内容的多行匹配

<?php

     $rows = file(’php.ini’);  //将php.ini文件读到数组中

     //循环遍历

     foreach($rows as $line)

     {

      If(trim($line))

      {

         //将匹配成功的参数写入数组中

         if(eregi(”^([a-z0-9_.]*) *=(.*)”, $line, $matches))

         {

            $options[$matches[1]] = trim($matches[2]);

         }

         unset($matches);

       }

     }

     //输出参数结果

     print_r($options);

?>

提示
 这里只是为了方便说明问题。解析一个*.ini文件,最佳方法是使用函数parse_ini_file()。该函数直接将*.ini文件解析到一个大数组中。
 

 正则表达式的替换
1.ereg_replace()和eregi_replace()
函数原型:string ereg_replace (string $pattern, string $replacement, string $string)

                                                                 string eregi_replace (string $pattern, string $replacement, string $string)

ereg_replace()在$string中搜索模式字符串$pattern,并将所匹配结果替换为$replacement。当$pattern中包含模式单元(或子模式)时,$replacement中形如“1”或“$1”的位置将依次被这些子模式所匹配的内容替换。而“0”或“$0”是指整个的匹配字符串的内容。需要注意的是,在双引号中反斜线作为转义符使用,所以必须使用“0”,“1”的形式。

eregi_replace()和ereg_replace()的功能一致,只是前者忽略大小写。代码6.6是本函数的应用实例,这段代码演示了如何对程序源代码做简单的清理工作。

 源代码的清理

<?php

     $lines = file(’source.php’);                                                                //将文件读入数组中

     for($i=0; $i<count($lines); $i++)

     {

         //将行末以“”或“#”开头的注释去掉

         $lines[$i] = eregi_replace(”(//|#).*$”, “”, $lines[$i]);

         //将行末的空白消除

         $lines[$i] = eregi_replace(”[ tvf]*$”, “”, $lines[$i]);

     }

     //整理后输出到页面

     echo htmlspecialchars(join(”",$lines));

?>

2.preg_replace()
函数原型:mixed preg_replace (mixed $pattern, mixed $replacement, mixed $subject [, int $limit])

preg_replace较ereg_replace的功能更加强大。其前三个参数均可以使用数组;第四个参数$limit可以设置替换的次数,默认为全部替换。是一个数组替换的应用实例。

数组替换

<?php

     //字符串

     $string = “Name: {Name}<br>Email: {Email}<br>Address: {Address}<br>”;

     //模式

     $patterns =array(

             “/{Address}/”,

             “/{Name}/”,

             “/{Email}/”

    );

     //替换字串

     $replacements = array (

             “No.5, Wilson St., New York, U.S.A”,

             “Thomas Ching”,

             “tom@emailaddress.com”,

     );

     //输出模式替换结果

     print preg_replace($patterns, $replacements, $string);

?>

输出结果如下。

Name: Thomas Ching”,

Email: tom@emailaddress.com

Address: No.5, Wilson St., New York, U.S.A

在preg_replace的正则表达式中可以使用模式修正符“e”。其作用是将匹配结果用作表达式,并且可以进行重新运算。例如:

<?php

     $html_body = “<HTML><Body><H1>TEST</H1>My Picture<Img src=”my.gif”></Body></HTML>”;

     //输出结果中HTML标签将全部为小写字母

     echo preg_replace (

             “/(</?)(w+)([^>]*>)/e”,

             “‘1′.strtolower(’2′).’3′”,   //此处的模式变量2将被strtolower转换为小写字符

              $html_body);

?>

提示
 preg_replace函数使用了Perl兼容正则表达式语法,通常是比ereg_replace更快的替代方案。如果仅对字符串做简单的替换,可以使用str_replace函数。
 

正则表达式的拆分
1.split()和spliti()
函数原型:array split (string $pattern, string $string [, int $limit])

本函数返回一个字符串数组,每个单元为$string经正则表达式$pattern作为边界分割出的子串。如果设定了$limit,则返回的数组最多包含$limit个单元。而其中最后一个单元包含了$string中剩余的所有部分。spliti是split的忽略大小版本。代码6.8是一个经常用到关于日期的示例。

 日期的拆分

<?php

     $date = “08/30/2006″;

               

     //分隔符可以是斜线,点,或横线

     list($month, $day, $year) = split (’[/.-]‘, $date);

               

     //输出为另一种时间格式

     echo “Month: $month; Day: $day; Year: $year<br />”;

?>

2.preg_split()
本函数与split函数功能一致。代码6.9是一个查找文章中单词数量的示例。

代码6.9  查找文章中单词数量

<?php

     $seek  = array();

没有评论 »

揭密正则表达式

八月 6, 2007 | php | RSS 2.0

 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 ‘a’ 和 任意个 ‘b’ ”,那么 ‘ab’, ‘abb’, ‘abbbbbbbbbb’ 都符合这个特征。

    正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。

   正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。

    文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。

[ 点击下载 chm 版本] – DEELX 正则语法,包含其他高级语法的 chm 版本。


——————————————————————————–

1. 正则表达式规则
1.1 普通字符
    字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是”普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

    举例1:表达式 “c”,在匹配字符串 “abcde” 时,匹配结果是:成功;匹配到的内容是:”c”;匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)

    举例2:表达式 “bcd”,在匹配字符串 “abcde” 时,匹配结果是:成功;匹配到的内容是:”bcd”;匹配到的位置是:开始于1,结束于4。


——————————————————————————–

1.2 简单的转义字符
    一些不便书写的字符,采用在前面加 “” 的方法。这些字符其实我们都已经熟知了。

表达式
可匹配

,
代表回车和换行符

t
制表符


代表 “” 本身


    还有其他一些在后边章节中有特殊用处的标点符号,在前面加 “” 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 “^” 和 “$” 字符,则表达式就需要写成 “^” 和 “$”。

表达式
可匹配

^
匹配 ^ 符号本身

$
匹配 $ 符号本身

.
匹配小数点(.)本身


    这些转义字符的匹配方法与 “普通字符” 是类似的。也是匹配与之相同的一个字符。

    举例1:表达式 “$d”,在匹配字符串 “abc$de” 时,匹配结果是:成功;匹配到的内容是:”$d”;匹配到的位置是:开始于3,结束于5。


——————————————————————————–

1.3 能够与 ‘多种字符’ 匹配的表达式
    正则表达式中的一些表示方法,可以匹配 ‘多种字符’ 其中的任意一个字符。比如,表达式 “d” 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。

表达式
可匹配

d
任意一个数字,0~9 中的任意一个

w
任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

s
包括空格、制表符、换页符等空白字符的其中任意一个

.
小数点可以匹配除了换行符()以外的任意一个字符


    举例1:表达式 “dd”,在匹配 “abc123″ 时,匹配的结果是:成功;匹配到的内容是:”12″;匹配到的位置是:开始于3,结束于5。

    举例2:表达式 “a.d”,在匹配 “aaa100″ 时,匹配的结果是:成功;匹配到的内容是:”aa1″;匹配到的位置是:开始于1,结束于4。


——————————————————————————–

1.4 自定义能够匹配 ‘多种字符’ 的表达式
    使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

表达式
可匹配

[ab5@]
匹配 “a” 或 “b” 或 “5″ 或 “@”

[^abc]
匹配 “a”,”b”,”c” 之外的任意一个字符

[f-k]
匹配 “f”~”k” 之间的任意一个字母

[^A-F0-3]
匹配 “A”~”F”,”0″~”3″ 之外的任意一个字符


    举例1:表达式 “[bcd][bcd]” 匹配 “abc123″ 时,匹配的结果是:成功;匹配到的内容是:”bc”;匹配到的位置是:开始于1,结束于3。

    举例2:表达式 “[^abc]” 匹配 “abc123″ 时,匹配的结果是:成功;匹配到的内容是:”1″;匹配到的位置是:开始于3,结束于4。


——————————————————————————–

1.5 修饰匹配次数的特殊符号
    前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。

    使用方法是:”次数修饰”放在”被修饰的表达式”后边。比如:”[bcd][bcd]” 可以写成 “[bcd]{2}”。

表达式
作用

{n}
表达式重复n次,比如:”w{2}” 相当于 “ww”;”a{5}” 相当于 “aaaaa”

{m,n}
表达式至少重复m次,最多重复n次,比如:”ba{1,3}”可以匹配 “ba”或”baa”或”baaa”

{m,}
表达式至少重复m次,比如:”wd{2,}”可以匹配 “a12″,”_456″,”M12344″…

?
匹配表达式0次或者1次,相当于 {0,1},比如:”a[cd]?”可以匹配 “a”,”ac”,”ad”

+
表达式至少出现1次,相当于 {1,},比如:”a+b”可以匹配 “ab”,”aab”,”aaab”…

*
表达式不出现或出现任意次,相当于 {0,},比如:”^*b”可以匹配 “b”,”^^^b”…


    举例1:表达式 “d+.?d*” 在匹配 “It costs $12.5″ 时,匹配的结果是:成功;匹配到的内容是:”12.5″;匹配到的位置是:开始于10,结束于14。

    举例2:表达式 “go{2,8}gle” 在匹配 “Ads by goooooogle” 时,匹配的结果是:成功;匹配到的内容是:”goooooogle”;匹配到的位置是:开始于7,结束于17。


——————————————————————————–

1.6 其他一些代表抽象意义的特殊符号
    一些符号在表达式中代表抽象的特殊意义:

表达式
作用

^
与字符串开始的地方匹配,不匹配任何字符

$
与字符串结束的地方匹配,不匹配任何字符

b
匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符


    进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。

    举例1:表达式 “^aaa” 在匹配 “xxx aaa xxx” 时,匹配结果是:失败。因为 “^” 要求与字符串开始的地方匹配,因此,只有当 “aaa” 位于字符串的开头的时候,”^aaa” 才能匹配,比如:”aaa xxx xxx”。

    举例2:表达式 “aaa$” 在匹配 “xxx aaa xxx” 时,匹配结果是:失败。因为 “$” 要求与字符串结束的地方匹配,因此,只有当 “aaa” 位于字符串的结尾的时候,”aaa$” 才能匹配,比如:”xxx xxx aaa”。

    举例3:表达式 “.b.” 在匹配 “@@@abc” 时,匹配结果是:成功;匹配到的内容是:”@a”;匹配到的位置是:开始于2,结束于4。
    进一步说明:”b” 与 “^” 和 “$” 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 “w” 范围,另一边是 非”w” 的范围。

    举例4:表达式 “bendb” 在匹配 “weekend,endfor,end” 时,匹配结果是:成功;匹配到的内容是:”end”;匹配到的位置是:开始于15,结束于18。

    一些符号可以影响表达式内部的子表达式之间的关系:

表达式
作用

|
左右两边表达式之间 “或” 关系,匹配左边或者右边

( )
(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到


    举例5:表达式 “Tom|Jack” 在匹配字符串 “I’m Tom, he is Jack” 时,匹配结果是:成功;匹配到的内容是:”Tom”;匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:”Jack”;匹配到的位置时:开始于15,结束于19。

    举例6:表达式 “(gos*)+” 在匹配 “Let’s go go go!” 时,匹配结果是:成功;匹配到内容是:”go go go”;匹配到的位置是:开始于6,结束于14。

    举例7:表达式 “¥(d+.?d*)” 在匹配 “$10.9,¥20.5″ 时,匹配的结果是:成功;匹配到的内容是:”¥20.5″;匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:”20.5″。


——————————————————————————–

2. 正则表达式中的一些高级规则
2.1 匹配次数中的贪婪与非贪婪
    在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:”{m,n}”, “{m,}”, “?”, “*”, “+”,具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 “dxxxdxxxd”,举例如下:

表达式
匹配结果

(d)(w+)
“w+” 将匹配第一个 “d” 之后的所有字符 “xxxdxxxd”

(d)(w+)(d)
“w+” 将匹配第一个 “d” 和最后一个 “d” 之间的所有字符 “xxxdxxx”。虽然 “w+” 也能够匹配上最后一个 “d”,但是为了使整个表达式匹配成功,”w+” 可以 “让出” 它本来能够匹配的最后一个 “d”


    由此可见,”w+” 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 “d”,但那也是为了让整个表达式能够匹配成功。同理,带 “*” 和 “{m,n}” 的表达式都是尽可能地多匹配,带 “?” 的表达式在可匹配可不匹配的时候,也是尽可能的 “要匹配”。这 种匹配原则就叫作 “贪婪” 模式 。

    非贪婪模式:

    在修饰匹配次数的特殊符号后再加上一个 “?” 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 “不匹配”。这种匹配原则叫作 “非贪婪” 模式,也叫作 “勉强” 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 “dxxxdxxxd” 举例:

表达式
匹配结果

(d)(w+?)
“w+?” 将尽可能少的匹配第一个 “d” 之后的字符,结果是:”w+?” 只匹配了一个 “x”

(d)(w+?)(d)
为了让整个表达式匹配成功,”w+?” 不得不匹配 “xxx” 才可以让后边的 “d” 匹配,从而使整个表达式匹配成功。因此,结果是:”w+?” 匹配 “xxx”


    更多的情况,举例如下:

    举例1:表达式 “<td>(.*)</td>” 与字符串 “<td><p>aa</p></td> <td><p>bb</p></td>” 匹配时,匹配的结果是:成功;匹配到的内容是 “<td><p>aa</p></td> <td><p>bb</p></td>” 整个字符串, 表达式中的 “</td>” 将与字符串中最后一个 “</td>” 匹配。

    举例2:相比之下,表达式 “<td>(.*?)</td>” 匹配举例1中同样的字符串时,将只得到 “<td><p>aa</p></td>”, 再次匹配下一个时,可以得到第二个 “<td><p>bb</p></td>”。


——————————————————————————–

2.2 反向引用 1, 2…
    表达式在匹配时,表达式引擎会将小括号 “( )” 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 “<td>(.*?)</td>”。

    其实,”小括号包含的表达式所匹配到的字符串” 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 “括号内的子匹配已经匹配到的字符串”。引用方法是 “” 加上一个数字。”1″ 引用第1对括号内匹配到的字符串,”2″ 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 “(” 在前,那这一对就先排序号。

    举例如下:

    举例1:表达式 “(’|”)(.*?)(1)” 在匹配 ” ‘Hello’, “World” ” 时,匹配结果是:成功;匹配到的内容是:” ‘Hello’ “。再次匹配下一个时,可以匹配到 ” “World” “。

    举例2:表达式 “(w)1{4,}” 在匹配 “aa bbbb abcdefg ccccc 111121111 999999999″ 时,匹配结果是:成功;匹配到的内容是 “ccccc”。再次匹配下一个时,将得到 999999999。这个表达式要求 “w” 范围的字符至少重复5次,注意与 “w{5,}” 之间的区别。

    举例3:表达式 “<(w+)s*(w+(=(’|”).*?4)?s*)*>.*?</1>” 在匹配 “<td id=’td1′ style=”bgcolor:white”></td>” 时,匹配结果是成功。如果 “<td>” 与 “</td>” 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。


——————————————————————————–

2.3 预搜索,不匹配;反向预搜索,不匹配
    前面的章节中,我讲到了几个代表抽象意义的特殊符号:”^”,”$”,”b”。它们都有一个共同点,那就是:它们本身不匹配任何字符,只是对 “字符串的两头” 或者 “字符之间的缝隙” 附加了一个条件。理解到这个概念以后,本节将继续介绍另外一种对 “两头” 或者 “缝隙” 附加条件的,更加灵活的表示方法。

    正向预搜索:”(?=xxxxx)”,”(?!xxxxx)”

    格式:”(?=xxxxx)”,在被匹配的字符串中,它对所处的 “缝隙” 或者 “两头” 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 “b”,本身不匹配任何字符。”b” 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。

    举例1:表达式 “Windows (?=NT|XP)” 在匹配 “Windows 98, Windows NT, Windows 2000″ 时,将只匹配 “Windows NT” 中的 “Windows “,其他的 “Windows ” 字样则不被匹配。

    举例2:表达式 “(w)((?=111)(1))+” 在匹配字符串 “aaa ffffff 999999999″ 时,将可以匹配6个”f”的前4个,可以匹配9个”9″的前7个。这个表达式可以读解成:重复4次以上的字母数字,则匹配其剩下最后2位之前的部分。当然,这个表达式可以不这样写,在此的目的是作为演示之用。

    格式:”(?!xxxxx)”,所在缝隙的右侧,必须不能匹配 xxxxx 这部分表达式。

    举例3:表达式 “((?!bstopb).)+” 在匹配 “fdjka ljfdl stop fjdsla fdj” 时,将从头一直匹配到 “stop” 之前的位置,如果字符串中没有 “stop”,则匹配整个字符串。

    举例4:表达式 “do(?!w)” 在匹配字符串 “done, do, dog” 时,只能匹配 “do”。在本条举例中,”do” 后边使用 “(?!w)” 和使用 “b” 效果是一样的。

    反向预搜索:”(?<=xxxxx)”,”(?<!xxxxx)”

    这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 “左侧”,两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 “正向预搜索” 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。

    举例5:表达式 “(?<=d{4})d+(?=d{4})” 在匹配 “1234567890123456″ 时,将匹配除了前4个数字和后4个数字之外的中间8个数字。由于 JScript.RegExp 不支持反向预搜索,因此,本条举例不能够进行演示。很多其他的引擎可以支持反向预搜索,比如:Java 1.4 以上的 java.util.regex 包,.NET 中System.Text.RegularExpressions 命名空间,以及本站推荐的最简单易用的 DEELX 正则引擎。


——————————————————————————–

3. 其他通用规则
    还有一些在各个正则表达式引擎之间比较通用的规则,在前面的讲解过程中没有提到。

3.1 表达式中,可以使用 “xXX” 和 “” 表示一个字符(”X” 表示一个十六进制数)

形式
字符范围

xXX
编号在 0 ~ 255 范围的字符,比如:空格可以使用 “x20″ 表示


任何字符可以使用 “u” 再加上其编号的4位十六进制数表示,比如:”中”


3.2 在表达式 “s”,”d”,”w”,”b” 表示特殊意义的同时,对应的大写字母表示相反的意义

表达式
可匹配

S
匹配所有非空白字符(”s” 可匹配各个空白字符)

D
匹配所有的非数字字符

W
匹配所有的字母、数字、下划线以外的字符

B
匹配非单词边界,即左右两边都是 “w” 范围或者左右两边都不是 “w” 范围时的字符缝隙


3.3 在表达式中有特殊意义,需要添加 “” 才能匹配该字符本身的字符汇总

字符
说明

^
匹配输入字符串的开始位置。要匹配 “^” 字符本身,请使用 “^”

$
匹配输入字符串的结尾位置。要匹配 “$” 字符本身,请使用 “$”

( )
标记一个子表达式的开始和结束位置。要匹配小括号,请使用 “(” 和 “)”

[ ]
用来自定义能够匹配 ‘多种字符’ 的表达式。要匹配中括号,请使用 “[" 和 "]“

{ }
修饰匹配次数的符号。要匹配大括号,请使用 “{” 和 “}”

.
匹配除了换行符()以外的任意一个字符。要匹配小数点本身,请使用 “.”

?
修饰匹配次数为 0 次或 1 次。要匹配 “?” 字符本身,请使用 “?”

+
修饰匹配次数为至少 1 次。要匹配 “+” 字符本身,请使用 “+”

*
修饰匹配次数为 0 次或任意次。要匹配 “*” 字符本身,请使用 “*”

|
左右两边表达式之间 “或” 关系。匹配 “|” 本身,请使用 “|”


3.4 括号 “( )” 内的子表达式,如果希望匹配结果不进行记录供以后使用,可以使用 “(?:xxxxx)” 格式

    举例1:表达式 “(?:(w)1)+” 匹配 “a bbccdd efg” 时,结果是 “bbccdd”。括号 “(?:)” 范围的匹配结果不进行记录,因此 “(w)” 使用 “1″ 来引用。

3.5 常用的表达式属性设置简介:Ignorecase,Singleline,Multiline,Global

表达式属性
说明

Ignorecase
默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 “大小写” 概念延伸至 UNICODE 范围的大小写。

Singleline
默认情况下,小数点 “.” 匹配除了换行符()以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。

Multiline
默认情况下,表达式 “^” 和 “$” 只匹配字符串的开始 ① 和结尾 ④ 位置。如:

①xxxxxxxxx②
③xxxxxxxxx④

配置为 Multiline 可以使 “^” 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 “$” 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。

Global
主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。




——————————————————————————–


4. 其他提示
4.1 如果想要了解高级的正则引擎还支持那些复杂的正则语法,可参见本站 DEELX 正则引擎的说明文档。

4.2 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 “^” 和 “$”,比如:”^d+$” 要求整个字符串只有数字。

4.3 如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 “b”,比如:使用 “b(if|while|else|void|int……)b” 来匹配程序中的关键字。

4.4 表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 “123″、”123.”、”123.5″、”.5″ 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:”d*.?d*”,因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:”d+.?d*|.d+”。

4.5 能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。

4.6 合理选择贪婪模式与非贪婪模式,参见话题讨论。

4.7 或 “|” 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 “|” 两边的表达式因为交换位置而有所不同。

没有评论 »

php正则表达式中的模式修正符

八月 6, 2007 | php | RSS 2.0

 

下面列出了当前在 PCRE 中可能使用的修正符。括号中是这些修正符的内部 PCRE 名。修正符中的空格和换行被忽略,其它字符会导致错误。

    i (PCRE_CASELESS)

        如果设定此修正符,模式中的字符将同时匹配大小写字母。

    m(PCRE_MULTILINE)

        默认情况下,PCRE 将目标字符串作为单一的一“行”字符所组成的(甚至其中包含有换行符也是如此)。“行起始”元字符(^)仅仅匹配字符串的起始,“行结束”元字符($)仅仅匹配字符串的结束,或者最后一个字符是换行符时其前面(除非设定了 D 修正符)。这和 Perl 是一样的。

        当设定了此修正符,“行起始”和“行结束”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。这和 Perl 的 /m 修正符是等效的。如果目标字符串中没有“”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

    s(PCRE_DOTALL)

        如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。这和 Perl 的 /s 修正符是等效的。排除字符类例如 [^a] 总是匹配换行符的,无论是否设定了此修正符。

    x(PCRE_EXTENDED)

        如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。这和 Perl 的 /x 修正符是等效的,使得可以在复杂的模式中加入注释。然而注意,这仅适用于数据字符。空白字符可能永远不会出现于模式中的特殊字符序列,例如引入条件子模式的序列 (?( 中间。

    e       如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。

        只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

            注意: 本修正符在 PHP3 中不可用。

    A(PCRE_ANCHORED)

        如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。此效果也可以通过适当的模式本身来实现(在 Perl 中实现的唯一方法)。

    D(PCRE_DOLLAR_ENDONLY)

        如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前(但不会匹配任何其它换行符之前)。如果设定了 m 修正符则忽略此选项。Perl 中没有与其等价的修正符。

    S        当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

    U(PCRE_UNGREEDY)

        本修正符反转了匹配数量的值使其不是默认的重复,而变成在后面跟上“?”才变得重复。这和 Perl 不兼容。也可以通过在模式之中设定 (?U) 修正符或者在数量符之后跟一个问号(如 .*?)来启用此选项。

    X(PCRE_EXTRA)

        此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,和 Perl 一样,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。当前没有其它特性受此修正符控制。

    u(PCRE_UTF8)

        此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起开始检查模式的 UTF-8 合法性。

没有评论 »

桥接模式

八月 6, 2007 | 软件工程/编程技巧/设计模式 | RSS 2.0

  最近一直忙着做东西,所以没空学这些东西!不过还是一有机会就学习设计模式!

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace ConsoleApplication1
{  //商业对象
    class BuinessObject
    {
        private DataObject dataObject;
        protected string group;
        public BuinessObject(string group)
        {
            this.group = group;
       
        }
        //数据对象属性
        public DataObject DataObject
       {
           set {

               dataObject = value;
               }
           get {
               return dataObject;
          
              }
       
        }
       //调用数据对象的引用来处理
        virtual public void Next()
        {
            dataObject.NextRecord();
       
        }
        virtual public void Prior()
        {
            dataObject.PriorRecord();
       
       
        }
        virtual public void New(string name)
        {
            dataObject.NewRecord(name);
       
        }
        virtual public void Delete(string name)
        {

            dataObject.DeleteRecord(name);
        }
        //单个显示
        virtual public void Show()
        {
            dataObject.ShowRecord();
       
       
        }
        //全部显示
        virtual public void ShowAll()
        {
            Console.WriteLine(”客户的集合:{0}”,group);
            dataObject.ShowAllRecords();
       
       
       
        }
   
   
    }
    //商业对象派生类-客户商业对象
    class CustomersBusinessObject : BuinessObject
    {
    //构造函数,调用原借口的构造函数
        public CustomersBusinessObject(string group):base(group){}
        public override void  ShowAll()
         {  

            Console.WriteLine();
            Console.WriteLine(”———————————————-”);
             base.ShowAll();
             Console.WriteLine(”——————–”);
         }
   
    }
    abstract class DataObject
    {
    abstract public void NextRecord();
    abstract public void PriorRecord();
    abstract public void NewRecord(string name);
    abstract public void DeleteRecord(string name);
    abstract public void ShowRecord();
    abstract public void ShowAllRecords();
   
   
   
    }

    //具体实现类–客户数据对象
    class CustomersDataObject:DataObject
    {
    private ArrayList customers=new ArrayList();
    private int current=0;
    public void  CustomersBusinessObject()
    {
   
    //可以从数据库中取
        customers.Add(”张三”);
        customers.Add(”李四”);
        customers.Add(”往五”);
        customers.Add(”张六”);
        customers.Add(”赵七”);
    }
        public override void  NextRecord()
        {
            if(current<=customers.Count-1)
                current++;

  //throw new Exception(”The method or operation is not implemented.”);
      }
        public override void  PriorRecord()
{

if(current>0)
    current–;
  //throw new Exception(”The method or operation is not implemented.”);
}
    public override void  NewRecord(string name)
{
        customers.Add(name);

  //throw new Exception(”The method or operation is not implemented.”);
}
    public override void  DeleteRecord(string name)
{
  customers.Remove(name);
        //throw new Exception(”The method or operation is not implemented.”);
}
    public override void  ShowAllRecords()
{
  foreach(string name in customers)
        Console.WriteLine(”" +name);
        //throw new Exception(”The method or operation is not implemented.”);
}
    public override void  ShowRecord()
    {
        Console.WriteLine(customers[current]);

  //throw new Exception(”The method or operation is not implemented.”);
     }
    }

    class Program
    {
        static void Main(string[] args)
        {
            CustomersBusinessObject customers=new CustomersBusinessObject(”广州顾客户单”);
            //设定他的具体实现类客户数据对象
            customers.DataObject=new CustomersDataObject();
            //单个显示出来
            customers.Show();
            customers.Next();
            customers.Show();
            customers.Next();
            customers.Show();
            customers.New(”陈八”);
            customers.ShowAll();
            Console.Read();

 


        }
    }
}

没有评论 »