Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 如何限制或排除Perl中的特殊字符或正则表达式?_Regex_Perl - Fatal编程技术网

Regex 如何限制或排除Perl中的特殊字符或正则表达式?

Regex 如何限制或排除Perl中的特殊字符或正则表达式?,regex,perl,Regex,Perl,我要求用户输入一个motif,以便使用标准键盘输入进行搜索 do { print "Enter a motif to search for: "; $motif = <STDIN>; chomp $motif; if ( $protein =~ /$motif/ ) { print "I found it!\n\n"; } else { print "I couldn\'t find it.\n\n";

我要求用户输入一个motif,以便使用标准键盘输入进行搜索

do {
    print "Enter a motif to search for: ";
    $motif = <STDIN>;
    chomp $motif;
    if ( $protein =~ /$motif/ ) {
        print "I found it!\n\n";
    } else {
        print "I couldn\'t find it.\n\n";
    }
} until ( $motif =~ /^\s*$/ );
do{
打印“输入要搜索的主题:”;
$motif=;
咀嚼$motif;
如果($protein=~/$motif/){
打印“我找到了!\n\n”;
}否则{
打印“我找不到它。\n\n”;
}
}直到($motif=~/^\s*$/);
问题是,如果用户键入正则表达式或特殊字符集,如“TTG**”,程序将出错:

Enter a motif to search for: TTG**
Nested quantifiers in regex; marked by <-- HERE in m/DE** <-- HERE / at example_
5-3.txt line 35, <STDIN> line 9.
输入要搜索的主题:TTG**

正则表达式中的嵌套量词;标记为如果不想使用正则表达式,请使用

或者,引用正则表达式:

if ($protein =~ /\Q$motif/) {

如果不想使用正则表达式,请使用

或者,引用正则表达式:

if ($protein =~ /\Q$motif/) {

如果您试图捕获损坏的正则表达式,您可以:

#!/usr/bin/env perl
use strict;
use warnings;

my $broken_re = '.**';
eval { qr/$broken_re/; };

print "Proceeding...\n";
print "Eval broke: $@\n" if $@;;
因此,你可以捕获任何不起作用的东西

但是,限制正则表达式要困难得多。因为你。。。你几乎要用正则表达式来表达你的正则表达式,这是一条疯狂之路。但是,如果要转义所有特殊字符,可以使用例如
quotameta
,或例如
\Q
\e
转义元字符


但是你也许可以在你的正则表达式中加入白名单元素,但我会对此保持警惕——一个部分工作/部分损坏的正则表达式引擎是很困难的

如果您试图捕获损坏的正则表达式,您可以:

#!/usr/bin/env perl
use strict;
use warnings;

my $broken_re = '.**';
eval { qr/$broken_re/; };

print "Proceeding...\n";
print "Eval broke: $@\n" if $@;;
因此,你可以捕获任何不起作用的东西

但是,限制正则表达式要困难得多。因为你。。。你几乎要用正则表达式来表达你的正则表达式,这是一条疯狂之路。但是,如果要转义所有特殊字符,可以使用例如
quotameta
,或例如
\Q
\e
转义元字符


但是你也许可以在你的正则表达式中加入白名单元素,但我会对此保持警惕——一个部分工作/部分损坏的正则表达式引擎是很困难的

你到底想完成什么?它在做它在锡上说的-如果你给它一个坏的正则表达式,它就不起作用了。你是在试图:a)阻止人们使用正则表达式,b)如果他们使用了不好的正则表达式,就陷阱错误,或者c)将文本作为文本进行匹配吗?嗨!(a)及(b)项。主要是试图阻止某些正则表达式,如果它们以错误的形式使用了允许的正则表达式,还试图避免出现错误。你到底想做什么?它在做它在锡上说的-如果你给它一个坏的正则表达式,它就不起作用了。你是在试图:a)阻止人们使用正则表达式,b)如果他们使用了不好的正则表达式,就陷阱错误,或者c)将文本作为文本进行匹配吗?嗨!(a)及(b)项。主要是试图阻止某些正则表达式,如果他们使用了错误格式中允许的正则表达式,还试图避免出现错误在这种情况下绝对不要使用正则表达式!如果它们有很多motif,那么速度就太慢了,而且motif总是一个简单的短字符串。在这种情况下绝对不要使用正则表达式!如果它们有很多图案,那么速度就太慢了,而且图案总是简单的短字符串。