如何用正則表示式匹配中文
阿新 • • 發佈:2019-02-12
前幾天因為在做學校教務處的爬蟲,用php抓取的成績和課程表竟然返回的是html格式的資料,也是很醉。沒辦法,乾脆用正則匹配吧。因為之前並沒有學過正則表示式,只好惡補了一下。在匹配的過程中遇到了一些問題,特別是在匹配中文的時候,很是蛋疼。下面說一下我的學習成果。
- 使用php在匹配中文的時候不能使用 \w 來匹配,可以使用元字元 . 來粗略匹配中文
- 精確匹配中文時需要考慮編碼環境,gb2312和 utf-8。這兩種編碼有什麼區別呢 ? 最主要的就是gb2312編碼的漢字佔兩個位元組,而utf-8編碼的漢字佔3個位元組。
一、好了,下面進入正題,如果你想匹配中文的話,可以採用下面的表示式:
utf-8編碼:
[\x{4e00}-\x{9fa5}]
例如:匹配5個漢字,便可以這麼寫:
/[\x{4e00}-\x{9fa5}]{5}/u
千萬注意,這個最後面的u一定要加上(如果是使用php的話),否則是無法正常匹配的。二、通過上面的表示式我們可以匹配一段模糊的中文,那如果我們想要匹配精準的某個字或者詞語呢 ?例如,我在做教務處爬蟲時,抓取到的成績不僅僅只是數字,還有優秀、通過、良好等。這種我們總不能漏掉吧? 可以使用下面的方式來匹配:
例如我們將 優秀 兩個字轉換成了該編碼,為 : \u4f18\u79c0
2. 匹配 優秀 兩個漢字的正則表示式如下:
/\x{4f18}\x{79c0}/u
想必大家應該已經明白了,拿到16進位制編碼後,有這麼幾步,將u改為x, 再將具體的16進位制編碼加上{ },最後不要忘記加上u
三、包含換行段落的匹配
先給出一段需匹配的程式碼:
我們的目標是從這段html程式碼中抓取星期一 — 星期日,有人可能會說,直接匹配td標籤,來個for迴圈就好了嗎,但現在我只是給出一個例子,很多時候我們拿到的資料並不像這樣有規律,所以成段匹配還是很有必要的。<span style="white-space:pre"> </span><tr class="H"> <td class="td0" style='width:5%;padding:0px;' colspan='2'></td> <td class='td0' style="width:13%;height:20px;"> 星期一 </td> <td class='td0' style="width:13%;height:20px;"> 星期二 </td> <td class='td0' style="width:13%;height:20px;"> 星期三 </td> <td class='td0' style="width:13%;height:20px;"> 星期四 </td> <td class='td0' style="width:13%;height:20px;"> 星期五 </td> <td class='td0' style="width:13%;height:20px;"> 星期六 </td> <td class='td0' style="width:13%;height:20px;"> 星期日 </td> <span style="white-space:pre"> </span></tr>
我一開始嘗試的方法是從<tr>匹配到</tr>, 將其中的漢字全部抓出來 ,但很不幸,失敗了。原因就是在於其中的換行,那我們怎樣才能匹配包含換行的文字呢 ?其實方法很簡單,只要使用這個表示式:/[.\s\S]*/
我曾經試過使用 /[.\n]/ 來匹配,但是並不可以。上面的表示式完美的解決了問題。