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 */
Run Code Online (Sandbox Code Playgroud)
我的解析代码如下.这里的代码无法处理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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的意见.
**大家好,
感谢您提供了许多出色的解决方 我是一个新人,我想根据你的帖子做更多的研究.
非常感谢.**
Sch*_*ern 10
我不会为你写你的正则表达式,或者给你一些剪切和粘贴到你的代码中的东西.按照你的正则表达式的速度,无论如何它将在下一个特殊案例中打破.我会给你的是一个更好的方法.
将每一行拆分为作业的右侧和左侧.
my($lhs, $rhs) = split m{\s* = \s*}x, $line, 2;
Run Code Online (Sandbox Code Playgroud)
现在,单独使用它们就容易多了.您只需在空白处拆分信息即可从左侧提取信息以获取所有标志(常量,修正等...),最后一个单词将是分配给的名称.
my @flags = split /\s+/, $lhs;
my $name = pop @flags;
Run Code Online (Sandbox Code Playgroud)
然后,如果需要,您可以通过@flags过滤行.
并且可以很容易地获得可能在括号内的值.使用非贪婪的正则表达式可确保它正确处理类似的内容foo = <bar> /* comment <stuff> */.
my($value) = $rhs =~ /<(.*?)>/;
Run Code Online (Sandbox Code Playgroud)
从这种方法中可以看出,它避免了必须猜测文件中可能出现的特殊关键字(常量,修复,私有).
我不知道这个文件中还有什么,你没说.