[Perl] 正規表達式:搜尋括號內的文字

Perl 的優點,在於極強的文字處理能力(這也是 Perl 當初設計的用途)。
通常用 Perl 處理文字時,採用的是正規表達式(Regular Expression,簡稱 regex)。

什麼是正規表達式?

正規表達式就是:一種描述文字結構的方法,能讓程式精確解析字串的組成,協助程式處理字串中的字元。
舉個例子。閱讀英文的文章時,我們很容易感知字串與字串以及字元與字元間的相互關係。所謂閱讀不僅是逐一字元讀入,而是可感知到單字、句子和文法等結構,最後在對語義做分析,然後理解整篇文章。
正規表達式,就是將閱讀文章的方法,告訴程式,讓程式也能摹仿我們解析文句的方式。

直接來看 Code,下面是我寫的一段程式,從這個例子可以學到:

  1. 如何用 Perl 搜尋單字,然後存在變數裡。
  2. 如何用 Perl 偵測是否有文句符合使用者定義的形式。
  3. 如何用正規表達式,讓程式找出左右括號內的文字(無論括號內有多少個空白字元)。

#!/usr/bin/perl
use strict;

my $input = <STDIN>;
while($input ne "")
{
      chop($input);
      print "I catch: " $1\n" if($input =~ /\(\s*(\w+)\s*\)/i);

      $input = <STDIN>;
}

執行此程式,當輸入一個任意字串,程式都能找到字串中首次出現的左右括號內的單字。
左右括號內的空白字元都被忽略,只擷取到括號內的詞:

輸入:I got an (  apple     ), it's great.
輸出:I catch: apple

說明
程式首先讀入使用者輸入的字串,存入 $input 變數。
chop 函式可以去掉結尾的字元,由於我們輸入完畢會按下 Enter,因此利用 chop 除去結尾的 '\n' 換行字元。

接著就是 if 判斷式內的正規表達式:/\(\s*(\w+)\s*\)/i
首先,搜尋的正規表達式是:/要搜尋的東西/
最右邊加上 i 代表大小寫視為相同。
要搜尋左右括號,因此用跳脫字元代表左右括號:/\(要搜尋的東西\)/
可知我們要搜尋的東西,表達式為: \s*(\w+)\s*
\s 代表空白,* 符號代表 * 符號所在位置的前一項目出現 0 次或 0 次以上。
中間的 \w 代表任意英文字元,也就是我們要找的括號內的項目,+號代表+號所在位置的前一項目出現 1 次或 1 次以上。
用左右小括號把 \w+ 框起來,代表我們要將找到的(括號內的)字,存入 $1 變數內。

我們可以連續使用小括號,將要存的對象用括號框起,存入 $1、$2 ... 內。

這程式很短,只有 11 行,僅依靠正規表達式,就成為十分方便的 parser。可以嘗試在上面的 if 判斷式中,加入不同的正規表達式,然後觀察程式行為,可逐漸體會正規表達式帶來的方便。


留言