在另一个正则表达式中使用正则表达式的匹配:跳过元字符

时间:2012-07-12 00:35:06

标签: regex perl

我有一个正则表达式(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工作,你知道还有其他选择吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您需要将文本转换为正则表达式模式。这就是quotemeta所做的。

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

quotemeta可以通过\Q..\E访问:

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

为什么重新实现quotemeta