使用正则表达式在字符串中转义正则表达式

问题描述:

我的脚本需要在每个字母后面插入模式(?:<\/?[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; 
} 
+0

你不应该尝试用正则表达式解析XML。它不会工作。 http://*.com/a/1732454/1331451 – simbabque

+0

'$ process_mod'的内容是什么? – Toto

+0

@ M42 @simbabque流程mod包含简单的单词。但mu脚本插入正则表达式。例如。 '需求和'可以'需求'。'?'和' – waghso

您要搜索在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 
+0

谢谢@amon我认为这对我的问题会有帮助,我会在我的脚本上试试,然后接受你的回答 – waghso

+0

我不能按照我在post?ie转义已插入的正则表达式? – waghso

在foreach循环的开始时,使用此:

for my $i(@b){ 
    $i = quotemeta $i; 
    $i .= '(?:<\/?[a-z\-\=\"\ ]>)?' if $flag == 0 and $i !~ /[\\|():?[\]]/; 
    #   don't escape __^ 
+0

得到相同的错误。
'不匹配(在正则表达式;实例')a( \)?nd' – waghso

+0

@wagh:不要逃避最后一个括号,看到我的编辑 – Toto

+0

错误消失了,谢谢 – waghso