我想在一个单词中的每个字符之间添加特定的模式,然后我希望将该单词+模式与文件内容相匹配。
我可以追加模式,但是匹配它需要花费很多时间..特别是在添加'\ 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
答案 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