正则表达式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/ 这当然是有问题的,看字面是与上面的符合,但