如果我们问那些UNIX系统的爱好者他们最喜欢什么,答案除了稳定的系统和可以远程启动之外,十有八九的人会提到正则表达式;如果我们再问他们最头痛的是什么,可能除了复杂的进程控制和安装过程之外,还会是正则表达式。那么正则表达式到底是什么?如何才能真正的掌握正则表达式并正确的加以灵活运用?本文将就此展开介绍,希望能够对那些渴望了解和掌握正则表达式的读者有所助益。
入门简介
简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具。我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等。此外,象JavaScript/" target="_blank">JavaScript这种客户端的脚本语言也提供了对正则表达式的支持。由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能。
正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
举例来说,正则表达式的一个最为普遍的应用就是用于验证用户在线输入的邮件地址的格式是否正确。如果通过正则表达式验证用户邮件地址的格式正确,用户所填写的表单信息将会被正常处理;反之,如果用户输入的邮件地址与正则表达的模式不匹配,将会弹出提示信息,要求用户重新输入正确的邮件地址。由此可见正则表达式在WEB应用的逻辑判断中具有举足轻重的作用。
基本语法
在对正则表达式的功能和作用有了初步的了解之后,我们就来具体看一下正则表达式的语法格式。
正则表达式的形式一般如下:
/love/
其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容,正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
较为常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符规定其前导字符必须在目标对象? 续出现一次或多次,“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次,而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
下面,就让我们来看一下正则表达式元字符的具体应用。
/fo+/
因为上述正则表达式中包含“+”元字符,表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。
/eg*/
因为上述正则表达式中包含“*”元字符,表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。
/Wil?/
因为上述正则表达式中包含“?”元字符,表示可以与目标对象中的 “Win”, 或者 “Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。
除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。例如,
/jim{2,6}/
上述正则表达式规定字符m可以在匹配对象中连续出现2-6次,因此,上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。
在对如何使用正则表达式有了初步了解之后,我们来看一下其它几个重要的元字符的使用方式。
s:用于匹配单个空格符,包括tab键和换行符;
S:用于匹配除单个空格符之外的所有字符;
d:用于匹配从0到9的数字;
w:用于匹配字母,数字或下划线字符;
W:用于匹配所有与w不匹配的字符;
. :用于匹配除换行符之外的所有字符。
(说明:我们可以把s和S以及w和W看作互为逆运算)
下面,我们就通过实例看一下如何在正则表达式中使用上述元字符。
/s+/
上記の正規表現は、ターゲットオブジェクト内の 1 つ以上のスペース文字と一致するために使用できます。
/d000/
複雑な財務諸表が手元にある場合、上記の正規表現を使用して、合計 1,000 元のすべての金額を簡単に見つけることができます。
上で紹介したメタキャラクターに加えて、正規表現にはロケーターという別の固有の特殊文字もあります。ロケーターは、ターゲット オブジェクト内で一致するパターンが現れる場所を指定するために使用されます。
より一般的に使用されるロケーターには、「^」、「$」、「 」、「B」などがあります。このうち、「」ロケーターは、一致するパターンがターゲット文字列の先頭に出現する必要があることを指定し、「$」ロケーターは、一致パターンがターゲット オブジェクトの末尾に出現する必要があることを指定し、「$」ロケーターは、一致するパターンがターゲット オブジェクトの末尾に出現する必要があることを指定します。一致するパターンは、ターゲット文字列の先頭または末尾の 2 つの境界のいずれかに出現する必要があり、「B」ロケーターは、一致するオブジェクトがターゲット文字列の先頭と末尾の 2 つの境界内に存在する必要があると規定します。同様に、一致するオブジェクトはターゲット文字列の先頭でも末尾でもありません。「^」と「$」、「」と「B」を 2 つのロケーターのセットと考えることもできます。例:
/^地獄/
上記の正規表現には「^」ロケーターが含まれているため、対象オブジェクト内の「hell」、「hello」、「hellhound」で始まる文字列と一致します。
/ar$/
上記の正規表現には「$」ロケーターが含まれているため、対象オブジェクト内の「car」、「bar」、「ar」で終わる文字列と一致します。
/ボン/
上記の正規表現パターンは「 」ロケーターで始まるため、対象オブジェクト内の「bomb」または「bom」で始まる文字列と一致します。
/男/
上記の正規表現パターンは「 」ロケーターで終わるため、対象オブジェクト内の「human」、「women」、または「man」で終わる文字列と一致します。
ユーザーがマッチングパターンをより柔軟に設定できるようにするために、正規表現を使用すると、ユーザーは特定の文字に限定されず、マッチングパターンの一定の範囲を指定できます。例:
/[A-Z]/
上記の正規表現は、AからZまでの範囲内の任意の大文字に一致します。
/[a-z]/
上記の正規表現は、a から z までの範囲内の任意の小文字に一致します。
/[0-9]/
上記の正規表現は0から9までの任意の数値に一致します。
/([a-z][A-Z][0-9])+/
上記の正規表現は、「aB0」などの文字と数字で構成される任意の文字列と一致します。ここでユーザーが注意する必要があるのは、正規表現で「()」を使用して文字列を結合できることです。 「()」記号に含まれる内容は、ターゲット オブジェクトにも出現する必要があります。したがって、「abc」の最後の文字は数字ではなく文字であるため、上記の正規表現は「abc」などの文字列とは一致しません。
プログラミングロジックの「OR」演算に似た正規表現を実装し、複数の異なるパターンからいずれかを選択してマッチングしたい場合は、パイプ文字「|」を使用できます。例:
/と|も|2/
上記の正規表現は、対象オブジェクトの「to」、「too」、または「2」に一致します。
正規表現でより一般的に使用される演算子として、否定演算子「[^]」もあります。先ほど紹介したロケーター「^」とは異なり、否定文字「[^]」は、パターンで指定された文字列が対象オブジェクト内に存在できないことを指定します。例:
/[^A-C]/
上記の文字列は、A、B、C を除く対象オブジェクト内の任意の文字と一致します。一般に、「^」が「[]」の中にある場合は負の演算子とみなされ、「^」が「[]」の外にある場合、または「[]」がない場合は負の演算子とみなされます。オペレーター。
最後に、ユーザーが正規表現パターンにメタキャラクターを追加して、一致するオブジェクトを見つける必要がある場合は、エスケープ文字「」を使用できます。例:
/つ*/
上記の正規表現は、対象オブジェクトの「The」ではなく「Th*」と一致します。