2013-03-18 32 views
0

我正在处理一个XML文档,我需要打开它并在同一行上转换为大写的一些特定标记值。如果我有相同的字,只负责替代其中的一个,虽然我使用的循环,如果两个不同的: 这是我的XML:如何在同一个xml行中使用Perl替换相同的单词?

<pageID="1" width="827" height="1169" Sender_Company="société" Sender_Address="société" Sender_Fax="" Category="C2" Language_2="" Document_Object="" Language_1="french" Language_3="" NumPage="1" Script_1="typed"> 

这是我的代码:

while (<FILEIN>) { 
    if ($_ =~ /pageID="1"/) { 
     $haschanged = 1; 
     if ($_ !~ /Sender_Address=""/) { 
      if ($_ =~ /(Sender_Address="(.*?)")/){ 
       my $SenderAddress = $2; 
       $SenderAddress = uc($SenderAddress); 
       $_ =~ s/$1/Sender_Address="$SenderAddress"/; 
      } 
     } 

     if ($_ !~ /Sender_Company=""/) { 
      if ($_ =~ /(Sender_Company="(.*?)")/) { 
       my $SenderCompany = $2; 
       $SenderCompany = uc($SenderCompany); 
       $_ =~ s/$1/Sender_Company="$SenderCompany"/; 
       #print "$_\n"; 
      } 
     } 
    } 
} 

当我使用两个不同的值Sender_Company="bla"Sender_Address="société"转换为大写作品,但是当我在这种情况下使用相同的单词Sender_Company="société"Sender_Address="société"它不会将转换为大写。 有没有人有任何想法?我无法找到它背后的逻辑,当我一次使用两个不同的if循环时,不想转换同一个单词。谢谢!

+0

感谢您的代码正确缩进。这会帮助你发现一般问题,主要是当你寻求帮助时,这对读者是一种尊重。 – 2013-03-18 12:00:38

+0

它适合我。 – Toto 2013-03-18 12:13:34

+2

使用XML解析器来处理XML。 – Mat 2013-03-18 12:22:38

回答

2

你的XML的理解是有点值得商榷:

  1. 这不是XML。这是最多(元素不是封闭的,标签名称不能兼作属性像<pageID="1">,没有<?xml ...?>声明,没有根元素,...)
  2. 不要用正则表达式;-)
  3. XML解析XML的XML片段没有“线条”的概念。

除此之外,代码应该工作正常。做笔记,你可以让你的生活简单,你的代码简称:

  1. $_ =~ /foo/相同/foo/$_ !~ /foo/是一样的!/foo/
  2. 而是提取两次捕获,并在第二代正则表达式的结果,你可以做到这一切只需一个步骤:

    s{ (?<=Sender_Address=") ([^"]+) (?=") }{ uc $1 }ex 
    

    等等,什么?我提取了一个或多个非“ - ”字符,后面跟着字符串Sender_Address=",后面跟着"(环视断言),我捕获它之间的东西,并用一个大写版本代替它,因为我匹配至少一个字符,我不必测试空标记的情况下/e标志允许替换代码(这里不是真的需要),并且/x允许我们包含不匹配的空白以获得更好的格式化

    您可以轻松地扩展这两个属性,你想要大写:

    # This subsumes your whole logic inside `if (/pageID="1"/)` 
    $haschanged = 1; 
    for my $attr (qw/Sender_Address Sender_Company/) { 
        s{ (?<=\Q$attr\E=") ([^"]+) (?=") }{ uc $1 }ex; 
    } 
    

    \Q...\E导致刑警组织即使它包含的字符将是正则表达式元字符,否则。

还有一些剩余的错误:

  1. 你不能大写所给出的实体字符。
  2. XML允许将单引号'...'用作标记值分隔符。你不处理他们
  3. 参见下你的XML认识的点...

所有这些都可以通过使用XML解析器,然后转化的DOM属性来解决。

相关问题