Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在正则表达式中设置`|`条件是否有任何限制?_Regex_Perl - Fatal编程技术网

Regex 在正则表达式中设置`|`条件是否有任何限制?

Regex 在正则表达式中设置`|`条件是否有任何限制?,regex,perl,Regex,Perl,我有下面的代码 $regex_data = "pattern|pattern1|pattern2|pattern3|pattern4|pattern5|pattern6"; my $data = "This line has some pattern"; if($data=~m/$regex_data/i) { print "Data matched with pattern\n"; } 在我上面的代码$regex_data中,所有可能的模式都由分隔。我正在从事未来的项目,但我

我有下面的代码

$regex_data = "pattern|pattern1|pattern2|pattern3|pattern4|pattern5|pattern6";  

my $data = "This line has some pattern";

if($data=~m/$regex_data/i)
{
    print "Data matched with pattern\n";
}
在我上面的代码
$regex_data
中,所有可能的模式都由
分隔。我正在从事未来的项目,但我不知道这种模式的局限性。因此,
$regex_data
直接实现到regex匹配。现在它正在工作(对于模式1..100的小集合)。我怀疑在正则表达式中的大型模式集上是否会出现任何问题

$regex_data = "pattern1|pattern2|pattern3|pattern4|pattern5|pattern6|pattern7|pattern8|pattern9|pattern10|pattern11|pattern12|pattern13|pattern14|pattern15|pattern16|pattern17|pattern18|pattern19|pattern20|pattern21|pattern22|pattern23|pattern24|pattern25|pattern26|pattern27|pattern28|pattern29|pattern30 .. and so on ";

您可以使用数组列表

use strict;
use warnings;

my $regex_data = "pattern|pattern1|pattern2|pattern3|pattern4|pattern5|pattern6";  

my @arrays = split/\|/, $regex_data;
my $data = "This line has some pattern";
if (grep { $data=~ /\b$_\b/} @arrays) 
{
    print "Data matched with pattern\n";
}
else
{
    print "Not matched...\n";
}

您可以使用数组列表

use strict;
use warnings;

my $regex_data = "pattern|pattern1|pattern2|pattern3|pattern4|pattern5|pattern6";  

my @arrays = split/\|/, $regex_data;
my $data = "This line has some pattern";
if (grep { $data=~ /\b$_\b/} @arrays) 
{
    print "Data matched with pattern\n";
}
else
{
    print "Not matched...\n";
}

正如我在评论中所写的那样,对交替的长度的唯一实际限制是它所占用的内存量

正则表达式引擎将一个替换编译成一个trie结构,我猜想将字符串扩展成一个替换列表将比编译的正则表达式占用更多的内存

另一方面,Perl循环的替代方案有一个很大的速度劣势

  • trie算法将比简单的迭代比较快得多

  • 正则表达式引擎是用C编写的,通常比Perl代码快得多

  • Perl循环必须对列表的每个段执行单独的正则表达式编译

下面是一个简单的基准测试,您可能希望将其增强为更具代表性的数据集。将交替直接用作正则表达式的速度要快2.5倍

use strict;
use warnings 'all';

use Benchmark 'cmpthese';
use List::Util 'any';

my $regex_data = 'pattern|pattern1|pattern2|pattern3|pattern4|pattern5|pattern6';

my $re = qr/$regex_data/i;

my $data = "This line has some pattern";

cmpthese(-10,{
    loop  => sub { any { $data =~ /$_/ } split /\|/, $regex_data },
    regex => sub { $data =~ $re },
});
输出
正如我在评论中所写的那样,对交替的长度的唯一实际限制是它所占用的内存量

正则表达式引擎将一个替换编译成一个trie结构,我猜想将字符串扩展成一个替换列表将比编译的正则表达式占用更多的内存

另一方面,Perl循环的替代方案有一个很大的速度劣势

  • trie算法将比简单的迭代比较快得多

  • 正则表达式引擎是用C编写的,通常比Perl代码快得多

  • Perl循环必须对列表的每个段执行单独的正则表达式编译

下面是一个简单的基准测试,您可能希望将其增强为更具代表性的数据集。将交替直接用作正则表达式的速度要快2.5倍

use strict;
use warnings 'all';

use Benchmark 'cmpthese';
use List::Util 'any';

my $regex_data = 'pattern|pattern1|pattern2|pattern3|pattern4|pattern5|pattern6';

my $re = qr/$regex_data/i;

my $data = "This line has some pattern";

cmpthese(-10,{
    loop  => sub { any { $data =~ /$_/ } split /\|/, $regex_data },
    regex => sub { $data =~ $re },
});
输出
如果“未知限制”指的是未知数量的更改,则可以使用
qr
操作符一次添加一个更改。如果
@patterns
包含备选方案列表:

use Data::Dumper;
my $re = qr{ \Q$patterns[0]\E }x;
for ( @patterns[1..$#patterns] ){
    $re = qr{ $re | \Q$_\E }x;
}
say Dumper $re;

有关更多详细信息,请参阅。

如果“未知限制”指的是未知数量的更改,则可以使用
qr
操作符一次添加一个。如果
@patterns
包含备选方案列表:

use Data::Dumper;
my $re = qr{ \Q$patterns[0]\E }x;
for ( @patterns[1..$#patterns] ){
    $re = qr{ $re | \Q$_\E }x;
}
say Dumper $re;

有关更多详细信息,请参阅。

你所说的“限制”是什么意思?@MarounMaroun我想知道,正则表达式将只支持n个
的n个数,或者使
的n个数没有问题不,没有真正的限制。虽然你会发现随着你变得越来越大,效率开始成为一个问题。为什么不能使用数组列表中的模式?看看你说的“限制”是什么意思?@MarounMaroun我想知道,正则表达式将只支持n个数
,或者不存在使
的n个数变为No的问题,没有真正的限制。虽然您会发现效率开始成为一个问题,因为您变得非常大。为什么不能使用数组中的模式列表?请参阅我的正则表达式模式从数据库中获取。DB具有模式,这些模式由
|
分隔。因此,我尝试在没有任何修改的情况下使用该模式。或者我需要使用
|
拆分数据。然后将生成grep。
grep
在这种情况下是一个错误的选择,因为它效率低下-它将根据每个元素匹配每个模式
regex
将在找到第一个匹配项时退出。@ssr1012@Sobrique说得对。我不想探究整个模式。这就是我没有在正则表达式中使用
g
修饰符的原因。grep将搜索整个数组。我的正则表达式模式是从DB获取的。DB具有模式,这些模式由
|
分隔。因此,我尝试在没有任何修改的情况下使用该模式。或者我需要使用
|
拆分数据。然后将生成grep。
grep
在这种情况下是一个错误的选择,因为它效率低下-它将根据每个元素匹配每个模式
regex
将在找到第一个匹配项时退出。@ssr1012@Sobrique说得对。我不想探究整个模式。这就是我没有在正则表达式中使用
g
修饰符的原因。grep将搜索整个阵列。