Nan*_* HE 1 regex perl parsing
美好的一天.
我的文本文件内容如下.tmp.txt(一个非常大的文件)
constant fixup private AlarmFileName = <A "C:\\TMP\\ALARM.LOG">  /* A Format */
constant fixup ConfigAlarms = <U1 0>         /*  U1 Format  */
constant fixup ConfigEvents = <U2 0>         /*  U2 Format  */
我的解析代码如下.这里的代码无法处理C:\\TMP\\ALARM.LOG(带引号的字符串).我不知道如何替换代码"s +([a-zA-Z0-9])+>"来处理[a-zA-Z0-9](上面的0)字符串和quated字符串(" C:\ TMP\ALARM.LOG"上面).
$source_file = "tmp.txt";
$dest_xml_file = "my.xml";
#Check existance of root directory
open(SOURCE_FILE, "$source_file") || die "Fail to open file $source_file";
open(DEST_XML_FILE, ">$dest_xml_file") || die "Coult not open output file $dest_xml_file";
$x = 0;
print DEST_XML_FILE  "<!-- from tmp.txt-->\n";
while (<SOURCE_FILE>) 
{
    &ConstantParseAndPrint;
}
sub ConstantParseAndPrint
{
 if ($x == 0)
 {
     if(/^\s*(constant)\s*(fixup|\/\*fixup\*\/|)\s*(private|)\s*(\w+)\s+=\s+<([a-zA-Z0-9]+)\s+([a-zA-Z0-9])+>\s*(\/\*\s*(.*?)\s*\*\/|)(\r|\n|\s)/)
                {
                    $name1 = $1;
                    $name2 = $2;
                    $name3 = $3;
                    $name4 = $4;
                    $name5 = $5;
                    $name6 = $6;
                    $name7 = $7;
                    printf DEST_XML_FILE "\t\t$name1";
                    printf DEST_XML_FILE "\t\t$name2";
                    printf DEST_XML_FILE "\t\t$name3";
                    printf DEST_XML_FILE "\t\t$name4";
                    printf DEST_XML_FILE "\t\t$name5";
                    printf DEST_XML_FILE "\t\t$name6";
                    printf DEST_XML_FILE "\t\t$name7";
                    $x = 1;
  }
 }
}
谢谢您的意见.
**大家好,
感谢您提供了许多出色的解决方 我是一个新人,我想根据你的帖子做更多的研究.
非常感谢.**
Sch*_*ern 10
我不会为你写你的正则表达式,或者给你一些剪切和粘贴到你的代码中的东西.按照你的正则表达式的速度,无论如何它将在下一个特殊案例中打破.我会给你的是一个更好的方法.
将每一行拆分为作业的右侧和左侧.
my($lhs, $rhs) = split m{\s* = \s*}x, $line, 2;
现在,单独使用它们就容易多了.您只需在空白处拆分信息即可从左侧提取信息以获取所有标志(常量,修正等...),最后一个单词将是分配给的名称.
my @flags = split /\s+/, $lhs;
my $name  = pop @flags;
然后,如果需要,您可以通过@flags过滤行.
并且可以很容易地获得可能在括号内的值.使用非贪婪的正则表达式可确保它正确处理类似的内容foo = <bar> /* comment <stuff> */.
my($value) = $rhs =~ /<(.*?)>/;
从这种方法中可以看出,它避免了必须猜测文件中可能出现的特殊关键字(常量,修复,私有).
我不知道这个文件中还有什么,你没说.