Perl在字符串末尾解析空格字符

时间:2012-12-21 11:00:14

标签: perl parsing

MMAPI_CLOCK_OUTPUTS = 1,        /*clock outputs system*/

使用以下方法解析上述内容:

$TheLine =~ /\s*(.*)\s*=\s*(.*),\s*\/\*(.*)\*\//)

变量$1在末尾包含空格,例如我们有"MMAPI_CLOCK_OUTPUTS "而不是"MMAPI_CLOCK_OUTPUTS"。为什么这些空间也被捕获了?我认为应该使用解析器代码

删除它们

3 个答案:

答案 0 :(得分:8)

正则表达式捕获(.*)贪心匹配,这意味着它将匹配尽可能多的字符。由于以下\s*可以是零长度,因此前面的字符串包括空格包含在捕获中。

通过添加问号(.*?)将其更改为非贪婪的模式,并使用不同的分隔符以避免必须转义模式中的斜杠

$TheLine =~ m<\s*(.*?)\s*=\s*(.*),\s*/\*(.*)\*/>

答案 1 :(得分:1)

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";
}

答案 2 :(得分:0)

如果=符号前面的字词中没有空格,请将(.*)更改为(\S+)

$TheLine =~ /\s*(\S+)\s*=\s*(.*),\s*\/\*(.*)\*\//)
           here __^