Regex 如何限制或排除Perl中的特殊字符或正则表达式?
我要求用户输入一个motif,以便使用标准键盘输入进行搜索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";
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总是一个简单的短字符串。在这种情况下绝对不要使用正则表达式!如果它们有很多图案,那么速度就太慢了,而且图案总是简单的短字符串。