你能帮我纠正我的解析代码吗?
constant fixup privite ConfigAlarms = <U1 0> /* comment here*/
下面的代码,
我不知道如何获得 U1
和 0
和**/* comment here*/**
的价值。
if(/^\s*(constant)\s*(fixup|\/\*fixup\*\/|)\s*(private|)\s*(\w+)^ ...(Need help here.)
{
$name1 = $1; # for content
$name2 = $2; # for fixup
$name3 = $3; # for privite
$name4 = $4; # for ConfigALarms
$name5 = $5; # for U1
$name6 = $6; # for 0
$name7 = $7; # for /* comment here*/
感谢您的导游
更新了已完成的代码
if(/^\s*(constant)\s*(fixup|\/\*fixup\*\/|)\s*(private|)\s*(\w+)\s+=\s+<([a-zA-Z0-9]+)\s+([0-9]+)>\s*\/\*\s*(.*?)\s*\*\/(\r|\n|\s)/)
答案 0 :(得分:2)
接受你的意见:
constant fixup privite ConfigAlarms = <U1 0> /* comment here*/
开始用正则表达式替换变量,同时保留常量(也需要转义Perl的东西):
constant fixup privite (\w+) = <([a-zA-Z0-9]+) ([0-9]+)> \/\* (.*?) \*\/
然后你可以使它对空格强大:
constant\s+fixup\s+privite\s(\w+)\s+=\s+<([a-zA-Z0-9]+)\s+([0-9]+)>\s+\/\*(.*?)\*\/
您的变量现在分别为1美元,2美元和3美元。
答案 1 :(得分:2)
您的正则表达式中的“private”与数据中的“privite”之间存在不匹配。
(\w+)
之后不应该有^;相反,你会有
\s*=\s*\<\s*(\S+)\s+(\S+)\s*\>\s*\/\*\s*(.*?)\s*\*\/
或类似的东西,假设&lt;&gt;内有两件事。那些东西除了空间之外什么都有。如果这些假设不正确,您需要提供有关数据外观的更多信息。
答案 2 :(得分:2)
哎哟。首先,有一个x
修饰符将允许表达式中的非重要空格,以便您可以使其更具可读性:
my $pattern = qr{
^\s*
constant\s*
#etc
}x;
(注意结束大括号后的x
修饰符。)接下来,正如上一个示例所示,您可以为模式选择一个分隔符,这样就不必转义斜杠了。表达式:
my $pattern1 = qr/delimited by slashes/;
my $pattern2 = qr{delimited by curly braces};
如果您只是将表达式分组而不将其捕获到$1
,$2
等,则可以使用(?:…)
构造:
if ('foo bar' =~ /(?:foo)\s*(bar)/) {
say $1; # bar
}
或者,从Perl 5.10开始,您可以使用命名捕获:
if ('foo bar' =~ /(?<name>foo)\s*bar/) {
say $+{name}; # foo
}
这一切都应该让你的正则表达式更具可读性。你的问题的要点现在必须由其他人回答:)
答案 3 :(得分:2)
不必太复杂的正则表达式。你需要的只是简单的。
$string= "constant fixup privite ConfigAlarms = <U1 0> /* comment here*/";
@s = split / = / ,$string;
$s[-1] =~ s/<|>//g; #get rid of the < and >
print $s[-1];
上面会给你
$ perl perl.pl
U1 0 /* comment here*/
您可以通过再次拆分或使用匹配
的简单组继续此处@ss = split /\s+/ , $s[-1];
print Dumper(@ss);
前2个元素值将是U1和0,其余的你可以加入(或拼接)并将是你的评论