RegexN個有關問題
來源:互聯網
上載者:User
RegexN個問題
嗯嗯,如前些天的文章所述,我已經開始學正則了
自己摸索了三兩天,現在有些實在是搞不清楚的問題
我現在手上這本書講得不怎麼詳細,我是對著百度百科來學的
言歸正轉
=====================================
=====================================
問題1:
我想問,Regex一般都需要用
/ 包住內容嗎? /
而如果有修飾符的話,修飾符就寫在第二個 / 號後面是嗎?(比如 /aAa/i 以i作為修飾符才放第2個 / 號後面)
我是看著百度百科來學的,它這樣說到一段:
$
匹配行結束符。例如Regexweasel$ 能夠匹配字串"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
';
}
else
{
echo 'False
';
}
但結果卻是失敗
鼓搗了好久,我終於把
$pm2='weasel$';
改成
$pm2='/weasel$/';
成功了,百科卻沒有說這樣..
可能我沒認真看啥的
在這確認一下,搜尋的內容用 / 號在左右包住,修飾符在第2個/號後面是嗎?壓根連書寫規則都沒搞清楚呢我...別說匹配規則
=====================================
=====================================
問題2:
百科中第一個提到"元字元"的表格裡面,第四行提到的 * 號作用,用 .* 匹配我是理解了,但是後面它又這麼說"比如.* 可以匹配不管是什麼 "
於是我用以上代碼測試,卻顯示 找不到
~~~~~~~~~~~~~~~~~~~~~~
$str1=<<
test;
$pm1='/.*/';
if(preg_match($pm1,$str1))
{
echo '1.找到了
';
}
else
{
echo '1.找不到
';
}
~~~~~~~~~~~~~~~~~~~~~~
這裡嘛,它說的 .* 中包含 / ,我意識到 / 可能導致被誤認為是運算式終止符,於是換成了 \/ ,然而也不行,另外其實我將它的描述理解為: 這裡面的內容 可以被 .* 這個運算式匹配出來,然而我卻不知道怎麼寫這個運算式
=====================================
=====================================
問題3:
其實我將 \ 理解為轉義符,對嗎?感覺百科裡說法不是很明朗就像C語言裡或PHP裡的, \n 被轉義為 斷行符號符,
\t 是Tab定位字元, \\ 是 \ , \/ 就是 / ,\$ 就是 $ 什麼的
=====================================
=====================================
問題4:
以下代碼是根據百科 字元符 表的第7行所述'例如Regex\能夠匹配字串"for the wise"中的"the"'
$str1=<<for the wise
test;
$pm1='/\/';
if(preg_match($pm1,$str1))
{
echo '1.找到了
';
}
else
{
echo '1.找不到
';
}
找不到的原因是不是因為他後面還加了句"這個元字元不是所有的軟體都支援的"
=====================================
=====================================
問題5:
關於 ? 號的介紹,百度的完全看不懂,又找了下其它文獻
我理解為 app?path 的 ? 號前面的 app 三個字母在path前面出現一次就就能匹配,但是我無法理解這樣設定字元
$str1=<<abcdefg
test;
$pm1='/df?e/';
if(preg_match($pm1,$str1))
{
echo '1.找到了
';
}
else
{
echo '1.找不到
';
}
卻也能匹配!哪裡有df 啊,連個f都在e的後面,這裡開始導致我感覺自己白學了似的,好像還沒理解正則的匹配規則!
------解決方案--------------------
看了一半。你就這麼理解
/告訴正則 條件開始了 第二個/ 告訴正則 正則條件結束了。就是了其實 這僅僅 是一個組合 你甚至可以用##或者其他字元來代替這個所謂的開始和結束。
在這裡面 如果 / xxxxa/xxxxb/ 這個時候 正則會以為到了 xxxxa的時候就結束了,後面就會出錯,所這個時候我們就需要轉義讓它明白 那隻是中間的一個字元而不是結束。 這就是為什麼要用到轉義
$str1=<<
test;
$pm1='/.*/';
這裡 的匹配條件是 以 開始的 任一字元 然後一直到 結束 你的 str1 沒有 結束 他當然不匹配。
剩下的沒看了,讓其他人告訴你吧 哈哈
------解決方案--------------------
問題一:
/這裡才是真正的正則/
正則都需要用 // 包著在中間,如果有修正符的,加在最後一個/後面
如:preg_match('/aaa$/is') 這裡的is是修正符,至於每個是啥意思,你得查了
當然這裡要注意一下,//裡包著的正則如果也含有/這個東西,需要轉義的
還註明一下,這裡是用//包著正則,[email protected],你可以試試
問題二:
你這裡的當然是找不到的了,你要找的是 與以及中間的內容,你給出的內容只有 ”“,肯定不符合要求了,找不到是正常,找到了是你rp出現問題。
問題三:
像問題一我所說的,你用/包著正則,如果你的正則裡也出現/,當然要轉義了,還有,$^?之類的都是特殊字元,你想直接匹配那特殊字元,當然也要轉義了,不然電腦會當是特殊字元去處理
例子:
內容:aaabbb$ccc
如果你想匹配bb$cc 是否符合
1:/bb$cc/ 這當然是有問題的,看字面是與上面的符合,但電腦會把$這個當作最後的意思
2:/bb\$cc/ 這個是正確的