使用正则表达式在字符串中转义正则表达式
问题描述:
我的脚本需要在每个字母后面插入模式(?:<\/?[a-z\-\=\"\ ]+>)?
,这些字母可以在另一个正则表达式中使用。 问题是,有些单词可能是正则表达式,如.*?
或(?:<[a-z\-]+>)
。我尝试过,但错误throw unmatched regex
我的模式在(
或在正则表达式中创建的空间导致此问题后添加。任何帮助。使用正则表达式在字符串中转义正则表达式
这里是我试过的代码:
sub process_info{
my $process_mod = shift;
#print "$process_mod\n";
@b = split('',$process_mod);
my $flag;
for my $i(@b){
#print "@@@@@@@@ flag: $flag test: $i\n";
$i = "$i".'(?:<\/?[a-z\-\=\"\ ]>)?' if $flag == 0 and $i !~ /\\|\(|\)|\:|\?|\[|\]/;
#print "$i";
if ($i =~ /\\|\(|\)|\:|\?|\[|\]/){
$flag = 1;
}
else{
$flag = 0;
}
#print "After: $i\n";
}
$process_mod = join('',@b);
#print "$process_mod\n";
return $process_mod;
}
答
您要搜索在XML文件中的某些明文。您尝试通过在每个字符之间插入XML标记的正则表达式来实现此目的。这是一种浪费,但它可以通过转义输入所有的元字符与quotemeta
功能很容易做到:
sub make_XML_matchable {
my $string = @_;
my $xml_tag = qr{ ... }; # I won't write that regex for you
my $combined = join $xml_tag, map quotemeta, split //, $string;
return qr/$combined/; # return a compiled regex
}
这是假设你想要写一个正则表达式可以匹配的XML标签 - 不是不可能,但单调乏味,难以做到正确。使用XML解析器,而不是从部分去除所有标签:
use XML::LibXML;
my $dom = XML::LibXML->load_xml(string => $xml)
my $text_content = $dom->textContent; # all tags are gone
或者如果你实际上是试图以配合HTML,那么你可能想使用Mojolicious:
use Mojo;
my $dom = Mojo::DOM->new($html);
my $text_content = $dom->all_text; # all tags are replaced by a space
你不应该尝试用正则表达式解析XML。它不会工作。 http://*.com/a/1732454/1331451 – simbabque
'$ process_mod'的内容是什么? – Toto
@ M42 @simbabque流程mod包含简单的单词。但mu脚本插入正则表达式。例如。 '需求和'可以'需求'。'?'和' – waghso