2012-07-12 67 views
1

我有一個正則表達式(REGEX 1)加上一些Perl代碼,它從一個大文本文檔中挑選出一個特定的文本字符串,稱爲START_POINT。此START_POINT是我想要從大型文本文檔中提取的較大字符串的開頭。我想使用另一個正則表達式(REGEX 2)從START_POINT提取到END_POINT。我在正則表達式(REGEX 2)中使用了一組單詞,這將很容易找到END_POINT。這是我的問題。 START_POINT文本字符串可能包含將由正則表達式不同解釋的元字符。我不知道這些將會是什麼。我正在嘗試處理一大組文本文檔,並且START_POINT將因文檔而異。如何告訴正則表達式將文本字符串解釋爲文本字符串而不是包含元字符的文本字符串?在另一個正則表達式中使用正則表達式中的匹配:跳過元字符

也許這個代碼會幫助這更有意義。 $ START_POINT在代碼上面的代碼中被識別,並且是大文本字符串$ TEXT的提取部分。

my $END_POINT = "(STOP|CEASE|END|QUIT)"; 

my @NFS = $TEXT =~ m/(($START_POINT).*?($END_POINT))/misog; 

我試過使用quotemeta函數,但沒有任何成功。它似乎通過添加更改文本的斜線來破壞$ START_POINT文本字符串的完整性。

因此,總結我正在尋找一些方法來告訴正則表達式在$ START_POINT中查找確切的字符串,而不將任何字符串解釋爲元字符,同時仍保持字符串的完整性。儘管我可能能夠獲得quotemeta的工作,但是您是否知道其他可用選項?

在此先感謝您的幫助!

+0

你可以顯示一個示例字符串,其中'quotemeta'爲你做錯了什麼?在一般情況下,它添加的反斜槓(不是斜線)正是您要求的。 – tripleee 2012-07-12 05:19:02

回答

0

您需要將文本轉換爲正則表達式模式。這就是quotemeta所做的。

my $start = '*'; 
my $start_pat = quotemeta($start); # * => \* 
/$start_pat/      # Matches "*" 

quotemeta可以通過\Q..\E訪問:

my $start = '*'; 
/\Q$start_pat\E/     # Matches "*" 

爲什麼重新實現quotemeta