MMAPI_CLOCK_OUTPUTS = 1, /*clock outputs system*/用这个来解析上面的代码:
$TheLine =~ /\s*(.*)\s*=\s*(.*),\s*\/\*(.*)\*\//)变量$1在末尾包含空白,例如我们有"MMAPI_CLOCK_OUTPUTS "而没有"MMAPI_CLOCK_OUTPUTS"。为什么这些空间也会被捕获?我认为应该在解析器代码中删除它们。
发布于 2012-12-21 19:09:20
正则表达式捕获(.*)是贪婪的匹配,这意味着它将匹配尽可能多的字符。由于以下\s*的长度可以为零,因此捕获中包含包含空格的前面的字符串。
通过添加问号(.*?)将其更改为非贪婪模式,并使用不同的分隔符,以避免必须转义模式中的斜杠
$TheLine =~ m<\s*(.*?)\s*=\s*(.*),\s*/\*(.*)\*/>发布于 2012-12-21 23:44:42
TIMTOWTDI,或者“我很久没用过Regexp::Grammars了”
#!/usr/bin/env perl
use strict;
use warnings;
use Regexp::Grammars;
my $parser = qr{
<nocontext:>
<Definitions>
<rule: Definitions> <[Definition]>*
<rule: Definition> <Variable> = <Value>
<rule: Variable> <Word>
<rule: Value> <Word>
<rule: Word> [\w\d_]+
}xms;
my $str = 'MMAPI_CLOCK_OUTPUTS = 1, /*clock outputs system*/';
$str =~ $parser;
# see the whole matched structure
use Data::Dumper;
print Dumper \%/;
# or walk the structure for results
for my $def (@{ $/{Definitions}{Definition} }) {
print $def->{Variable}{Word} . ' => ' . $def->{Value}{Word} . "\n";
}发布于 2012-12-21 19:08:24
如果=符号前的单词没有空格,请将(.*)更改为(\S+)
$TheLine =~ /\s*(\S+)\s*=\s*(.*),\s*\/\*(.*)\*\//)
here __^https://stackoverflow.com/questions/13988885
复制相似问题