前向界定符包括前向肯定界定符和前項否定界定符,如下所示:
(?=...)
前向肯定界定符。如果所含正規表達式,以 ... 表示,在目前位置成功比對時成功,否則失敗。但一旦所含表達式已經嘗試,比對引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。
(?!...)
前向否定界定符。與肯定界定符相反;當所含表達式不能在字元串目前位置比對時成功
通過示範在哪前向可以成功有助于具體實作。考慮一個簡單的模式用于比對一個檔案名,并将其通過 "." 分成基本名和擴充名兩部分。如在 "news.rc" 中,"news" 是基本名,"rc" 是檔案的擴充名。
比對模式非常簡單:
.*[.].*$
注意 "." 需要特殊對待,因為它是一個元字元;我把它放在一個字元類中。另外注意後面的 $; 添加這個是為了確定字元串所有的剩餘部分必須被包含在擴充名中。這個正規表達式比對 "foo.bar"、"autoexec.bat"、 "sendmail.cf" 和 "printers.conf"。
現在,考慮把問題變得複雜點;如果你想比對的擴充名不是 "bat" 的檔案名?一些不正确的嘗試:
.*[.][^b].*$
上面的第一次去除 "bat" 的嘗試是要求擴充名的第一個字元不是 "b"。這是錯誤的,因為該模式也不能比對 "foo.bar"。
.*[.]([^b]..|.[^a].|..[^t])$
當你試着修補第一個解決方法而要求比對下列情況之一時表達式更亂了:擴充名的第一個字元不是 "b"; 第二個字元不是 "a";或第三個字元不是 "t"。這樣可以接受 "foo.bar" 而拒絕 "autoexec.bat",但這要求隻能是三個字元的擴充名而不接受兩個字元的擴充名如 "sendmail.cf"。我們将在努力修補它時再次把該模式變得複雜。
.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$
在第三次嘗試中,第二和第三個字母都變成可選,為的是允許比對比三個字元更短的擴充名,如 "sendmail.cf"。
該模式現在變得非常複雜,這使它很難讀懂。更糟的是,如果問題變化了,你想擴充名不是 "bat" 和 "exe",該模式甚至會變得更複雜和混亂。
前向否定把所有這些裁剪成:
.*[.](?!bat$).*$
前向的意思:如果表達式 bat 在這裡沒有比對,嘗試模式的其餘部分;如果 bat$ 比對,整個模式将失敗。後面的 $ 被要求是為了確定象 "sample.batch" 這樣擴充名以 "bat" 開頭的會被允許。
将另一個檔案擴充名排除在外現在也容易;簡單地将其做為可選項放在界定符中。下面的這個模式将以 "bat" 或 "exe" 結尾的檔案名排除在外。
.*[.](?!bat$|exe$).*$