正则表达式匹配一个字符串

时间:2014-08-27 16:47:11

标签: regex perl

我正在做一个perl脚本,它会对xml文件进行一些格式化。在打开任何xml标签之前,我需要一些帮助来忽略空格。我有以下xml文件

的test.xml

   <xml>
      <TI>Definitions, Exemptions and Rebates "where"  


    <VARPARA><VAR>E</VAR></VARPARA></TI>
   </xml>  

我想要一个正则表达式,它将在打开任何带有单个空格的xml标记之前替换任何空格,包括额外的空格和换行符,因此在上面的例子中<VARPARA>是带有一些空格的标记和#34;之后的新行字符&#34;。

我正在思考

的内容
$s =~ s/\s*</ </ig; 

但是在这里它只会查看开始标记<,而我想检查开始<和结束标记>以及

    <VARPARA>

输出字符串应如下所示

    <xml>
      <TI>Definitions, Exemptions and Rebates "where" <VARPARA><VAR>E</VAR></VARPARA></TI>
   </xml>  

3 个答案:

答案 0 :(得分:2)

要确定<是否是标记的开头,您必须查明它是否在评论中,在CDATA部分中等等。您需要的不仅仅是正则表达式。我建议使用现有的解析器。

use XML::LibXML qw( );

my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($qfn);

for my $text_node ($doc->findnodes('//text()')) {
   my $text = $text_node->data();
   next if $text =~ /^\s+\z/;

   my $next_node = $text_node->nextSibling();
   next if !$next_node;

   $text =~ s/\s+\z/ /;
   $text_node->setData($text);
}

$doc->toFile($qfn);

答案 1 :(得分:1)

我不是正则表达式专家,所以在某些情况下这可能会失败,但根据您的上一条评论,请尝试下一步:

echo '<xml>
      <TI>Definitions, Exemptions and Rebates "where"  


    <VARPARA><VAR>E</VAR></VARPARA></TI>

<TI>Definitions, Exemptions and Rebates "where"  


    <VARPARA><VAR>E</VAR></VARPARA></TI>
</xml>' | perl -0777 -pE 's/(\S)(\s+)(<\w+?>)/$1 $3/g;s/> +</>\n</g'
<xml>
<TI>Definitions, Exemptions and Rebates "where" <VARPARA><VAR>E</VAR></VARPARA></TI>
<TI>Definitions, Exemptions and Rebates "where" <VARPARA><VAR>E</VAR></VARPARA></TI>
</xml>

答案 2 :(得分:0)

这就是我处理它的方式。

$ s = ~s / \ s +(?= \&lt; \ w +&gt;)/ / xig;