日期:2014-05-17  浏览次数:20627 次

正则表达式N个问题
嗯嗯,如前些天的帖子所述,我已经开始学正则了
自己摸索了三两天,现在有些实在是搞不清楚的问题
我现在手上这本书讲得不怎么详细,我是对着百度百科来学的
言归正转
=====================================
=====================================
问题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的后面,这里开始导致我感觉自己白学了似的,好像还没理解正则的匹配规则!
  



------解决方案--------------------
看了一半。你就这么理解

/告诉正则 条件开始了 第二个/ 告诉正则 正则条件结束了。就是了其实 这仅仅 是一个组合 你甚至可以用##或者其他字符来代替这个所谓的开始和结束。

在这里面 如果 / xxxxa/xxxxb/ 这个时候 正则会以为到了 xxxxa的时候就结束了,后面就会出错,所这个时候我们就需要转义让它明白 那只是中间的一个字符而不是结束。 这就是为什么要用到转义

$str1=<<<test
<T>
test;

$pm1='/<T>.*</T>/';

这里 的匹配条件是 以 <T>开始的 任意字符 然后一直到 </T>结束 你的 str1 没有 </T>结束 他当然不匹配。
剩下的没看了,让其他人告诉你吧 哈哈
------解决方案--------------------
问题一:
/这里才是真正的正则/
正则都需要用 // 包着在中间,如果有修正符的,加在最后一个/后面
如:preg_match('/aaa$/is') 这里的is是修正符,至于每个是啥意思,你得查了
当然这里要注意一下,//里包着的正则如果也含有/这个东西,需要转义的
还注明一下,这里是用//包着正则,也可以用#@之里的包着,你可以试试

问题二:
你这里的当然是找不到的了,你要找的是 <T>与</T>以及中间的内容,你给出的内容只有 ”<T>“,肯定不符合要求了,找不到是正常,找到了是你rp出现问题。

问题三:
像问题一我所说的,你用/包着正则,如果你的正则里也出现/,当然要转义了,还有,$^?之类的都是特殊字符,你想直接匹配那特殊字符,当然也要转义了,不然计算机会当是特殊字符去处理
例子:
内容:aaabbb$ccc
如果你想匹配bb$cc 是否符合
1:/bb$cc/ 这当然是有问题的,看字面是与上面的符合,但