嗯嗯,如前些天的帖子所述,我已经开始学正则了
自己摸索了三两天,现在有些实在是搞不清楚的问题
我现在手上这本书讲得不怎么详细,我是对着百度百科来学的
言归正转
=====================================
=====================================
问题1:
我想问,正则表达式一般都需要用/ 包住内容吗? /而如果有修饰符的话,修饰符就写在第二个 / 号后面是吗?(比如  /aAa/i  以i作为修饰符才放第2个  / 号后面)
我是看着百度百科来学的,它这样说到一段:$
匹配行结束符。例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾
但是不能匹配字符串"They are a bunch of weasels."
于是我用PHP写了下代码调试,
$str2="He's a weasel";
$pm2='weasel$';if(preg_match($pm2,$str2))
{
echo 'True<br/>';
}
else
{
echo 'False<br/>';
}但结果却是失败
鼓捣了好久,我终于把
$pm2='weasel$';
改成
$pm2='/weasel$/';成功了,百科却没有说这样..
可能我没认真看啥的
在这确认一下,搜索的内容用 / 号在左右包住,修饰符在第2个/号后面是吗?压根连书写规则都没搞清楚呢我...别说匹配规则
=====================================
=====================================
问题2:
百科中第一个提到"元字符"的表格里面,第四行提到的 * 号作用,用  .*  匹配我是理解了,但是后面它又这么说"比如<T>.*</T> 可以匹配<T>不管是什么</T> "于是我用以上代码测试,却显示  找不到
~~~~~~~~~~~~~~~~~~~~~~
$str1=<<<test
<T>
test;$pm1='/<T>.*</T>/';if(preg_match($pm1,$str1))
{
echo '1.找到了<br/>';
}
else
{
echo '1.找不到<br/>';
}~~~~~~~~~~~~~~~~~~~~~~
这里嘛,它说的 <T>.*</T>  中包含  /  ,我意识到  /  可能导致被误认为是表达式终止符,于是换成了  \/  ,然而也不行,另外其实我将它的描述理解为: <T>这里面的内容</T>  可以被   <T>.*</T>   这个表达式匹配出来,然而我却不知道怎么写这个表达式=====================================
=====================================
问题3:
其实我将  \  理解为转义符,对吗?感觉百科里说法不是很明朗就像C语言里或PHP里的,  \n  被转义为 回车符,
\t  是Tab制表符,  \\  是 \  ,  \/ 就是 /  ,\$ 就是 $ 什么的
=====================================
=====================================
问题4:
以下代码是根据百科 字元符 表的第7行所述'例如正则表达式\<the\>能够匹配字符串"for the wise"中的"the"'

$str1=<<<test
for the wise
test;$pm1='/\<the\>/';
if(preg_match($pm1,$str1))
{
echo '1.找到了<br/>';
}
else
{
echo '1.找不到<br/>';
}
找不到的原因是不是因为他后面还加了句"这个元字符不是所有的软件都支持的"=====================================
=====================================
问题5:
关于  ?  号的介绍,百度的完全看不懂,又找了下其它文献
我理解为    app?path   的 ? 号前面的  app   三个字母在path前面出现一次就就能匹配,但是我无法理解这样设置字符$str1=<<<test
abcdefg
test;$pm1='/df?e/';
if(preg_match($pm1,$str1))
{
echo '1.找到了<br/>';
}
else
{
echo '1.找不到<br/>';
}却也能匹配!哪里有df 啊,连个f都在e的后面,这里开始导致我感觉自己白学了似的,好像还没理解正则的匹配规则!
  

解决方案 »

  1.   

    看了一半。你就这么理解/告诉正则 条件开始了 第二个/ 告诉正则 正则条件结束了。就是了其实 这仅仅 是一个组合 你甚至可以用##或者其他字符来代替这个所谓的开始和结束。在这里面 如果 / xxxxa/xxxxb/ 这个时候 正则会以为到了 xxxxa的时候就结束了,后面就会出错,所这个时候我们就需要转义让它明白 那只是中间的一个字符而不是结束。 这就是为什么要用到转义$str1=<<<test
    <T>
    test;$pm1='/<T>.*</T>/';这里 的匹配条件是  以 <T>开始的 任意字符 然后一直到 </T>结束 你的 str1 没有 </T>结束 他当然不匹配。
    剩下的没看了,让其他人告诉你吧 哈哈
      

  2.   

    好, 我说一点,不要对着百度百科学东西....看八卦还行....
    这部分手册上都已经有中文翻译:
    http://www.php.net/manual/zh/pcre.pattern.php
      

  3.   

    问题一:
    /这里才是真正的正则/    
    正则都需要用 // 包着在中间,如果有修正符的,加在最后一个/后面
    如:preg_match('/aaa$/is') 这里的is是修正符,至于每个是啥意思,你得查了
    当然这里要注意一下,//里包着的正则如果也含有/这个东西,需要转义的
    还注明一下,这里是用//包着正则,也可以用#@之里的包着,你可以试试问题二:
    你这里的当然是找不到的了,你要找的是 <T>与</T>以及中间的内容,你给出的内容只有 ”<T>“,肯定不符合要求了,找不到是正常,找到了是你rp出现问题。问题三:
    像问题一我所说的,你用/包着正则,如果你的正则里也出现/,当然要转义了,还有,$^?之类的都是特殊字符,你想直接匹配那特殊字符,当然也要转义了,不然计算机会当是特殊字符去处理
    例子:
    内容:aaabbb$ccc
    如果你想匹配bb$cc 是否符合
    1:/bb$cc/  这当然是有问题的,看字面是与上面的符合,但计算机会把$这个当作最后的意思
    2:/bb\$cc/ 这个是正确的
    问题四:
    你给的例子是找不到的,结果是正确的
    '/\<the\>/'  要找 <the> 这个字符,在你要搜索的内容里根本不存在
    问题五:
    ? 的意思是匹配前面的模式 1次或0次
    如 app?ee 匹配以下的(?表明匹配前面的一个p 1次或0次,即可无可有,有的情况只有一个)
    appee :这个是可以
    apee :可以
    以你上面的例子说明
    /df?e/  也就是说明d后面的那个f可以有一次或没有,而且后面紧跟着e,你的匹配内容‘abcdefg’不就是d后面没有,且紧跟着e吗??PS:不要去百度百科,害人不浅的地方
    可以去别人的博客去看(不保证完全正确,但比百科好多了)
    手册最安全了
      

  4.   

    关于问题四,百科说了
    '例如正则表达式[color=#FF0000]\<the\>能够匹配字符串"for the wise"中的"the"[/color]'于是我照样复制了来调试,按照你的意思说,它的表达式意思是要找  <the>  ,但百科说这表达式能匹配"for the wise"……好吧,百科果然害人不浅,以后不信它了.
    -----------------
    问题5的
    理解了
    就是说  ? 号前面那个可有可无,无 匹配,有 也能匹配,但是有一个字符却不是必须有的那个字符就不匹配然后我试了一下用这个来匹配一个人名
    $str1='陈伟明'
    $pm1='/陈伟?明/';
    能匹配
    然而$str1='陈明'的时候却不能匹配
    这时候我强烈意识到是字符的问题,中文字是2字节的,它可能在找目标字符串里没有的时候尝试与"无"的情况匹配,然而无的话却不是无"伟"这个字,而是"无1个字节"来判断,于是我把表达式换成/陈w明/就成功了,要这样匹配两个人名,该怎么写表达式呢?
      

  5.   


    通配符 通杀preg_match('/陈.*明/',$str,$marray);
      

  6.   

    utf-8 文档格式
    $str='陈小明';
    preg_match('/陈[\x{4e00}-\x{9fa5}]{1}明$/u',$str,$marray);
    print_r($marray);