1. 程式人生 > >如何用正則表示式匹配中文

如何用正則表示式匹配中文

前幾天因為在做學校教務處的爬蟲,用php抓取的成績和課程表竟然返回的是html格式的資料,也是很醉。沒辦法,乾脆用正則匹配吧。因為之前並沒有學過正則表示式,只好惡補了一下。在匹配的過程中遇到了一些問題,特別是在匹配中文的時候,很是蛋疼。下面說一下我的學習成果。

  1. 使用php在匹配中文的時候不能使用 \w 來匹配,可以使用元字元 . 來粗略匹配中文
  2. 精確匹配中文時需要考慮編碼環境,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

三、包含換行段落的匹配

先給出一段需匹配的程式碼:

<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>
我們的目標是從這段html程式碼中抓取星期一   —  星期日,有人可能會說,直接匹配td標籤,來個for迴圈就好了嗎,但現在我只是給出一個例子,很多時候我們拿到的資料並不像這樣有規律,所以成段匹配還是很有必要的。

我一開始嘗試的方法是從<tr>匹配到</tr>, 將其中的漢字全部抓出來 ,但很不幸,失敗了。原因就是在於其中的換行,那我們怎樣才能匹配包含換行的文字呢 ?其實方法很簡單,只要使用這個表示式:/[.\s\S]*/

我曾經試過使用 /[.\n]/  來匹配,但是並不可以。上面的表示式完美的解決了問題。