在perl中添加字符串中的模式

时间:2014-03-04 07:09:31

标签: regex perl

我想在一个单词中的每个字符之间添加特定的模式,然后我希望将该单词+模式与文件内容相匹配。

我可以追加模式,但是匹配它需要花费很多时间..特别是在添加'\ s *''\ n'等模式时

假设一个词是'accomodation'

然后在添加模式后,它变为

a(?:(?:<tag>|\n)+)?c(?:(?:<tag>|\n)+)?c(?:(?:<tag>|\n)+)?o(?:(?:<tag>|\n)+)?m(?:(?:<tag>|\n)+)?o(?:(?:<tag>|\n)+)?d(?:(?:<tag>|\n)+)?a(?:(?:<tag>|\n)+)?t(?:(?:<tag>|\n)+)?i(?:(?:<tag>|\n)+)?o(?:(?:<tag>|\n)+)?n

虽然将上述模式与$ filecontent匹配,但需要很多时间..请指出其他一些替代方案

示例2:

$string1 = "perl is not <match>frequently used</match> for web development";
$string2 = "perl is not fr<sc>e</sc>
qu<abctag>en<abctag>
tly used<abctag> for web development";

需要输出:

perl is not <match>fr<sc>e</sc>
qu<abctag>en<abctag>
tly used</match><abctag> for web development

2 个答案:

答案 0 :(得分:0)

(?:(?:...)+)?比需要的更冗长;你可以写(?:...)*。 (+表示“一个或多个”,?表示“零或一个”,*表示“零或更多”。)

但实际问题是你的正则表达式引发了大量的回溯;通过将重复包装在(?>...)中,可以显着提高性能,从而禁用回溯。 (在某些情况下,这会影响正则表达式的语义,但在您的示例中,它只会影响性能。)

看起来像这样:

a(?>(?:<tag>|\n)*)c(?>(?:<tag>|\n)*)c(?>(?:<tag>|\n)*)o(?>(?:<tag>|\n)*)m(?>(?:<tag>|\n)*)o(?>(?:<tag>|\n)*)d(?>(?:<tag>|\n)*)a(?>(?:<tag>|\n)*)t(?>(?:<tag>|\n)*)i(?>(?:<tag>|\n)*)o(?>(?:<tag>|\n)*)n

答案 1 :(得分:0)

仍然不确定问题是什么,但我会尝试。我假设实际问题如下: 您有一个要在大文件中找到的字符串。但是在该文件中,字符串可能已插入标记。因此,假设您要查找matchingString,那么您还希望模式找到m<bla>atching<blub>Strin<whatever>g。 因为没有相关的信息,我将假设标签是“按顺序”。也就是说,每个<后跟一些文本不是原始字符串的一部分(但不是<),后跟一个>,之后原始字符串将恢复。 所以没有像match<outer<inner>>ingString

my $pattern = "match";
my @b = split('',$pattern);
$pattern = join('(?><[^>]*?>)*',@b);

这应该会导致模式找到这些字符串,我想不出更快的方法。

m(?><[^>]*?>)*a(?><[^>]*?>)*t(?><[^>]*?>)*c(?><[^>]*?>)*h

Regular expression visualization

Debuggex Demo