1
MMAPI_CLOCK_OUTPUTS = 1,        /*clock outputs system*/

上記をこれで解析します:

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

変数$1の末尾には空白が含まれます。たとえば、 have"MMAPI_CLOCK_OUTPUTS "と not"MMAPI_CLOCK_OUTPUTS"です。それらのスペースもキャプチャされるのはなぜですか? パーサーコードでそれらを削除する必要があると思いました

4

3 に答える 3

8

正規表現のキャプチャ(.*)貪欲な一致です。つまり、できるだけ多くの文字に一致します。後続\s*はゼロ長になる可能性があるため、スペースを含む先行文字列がキャプチャに含まれます。

クエスチョン マークを追加して貪欲でないパターンに変更し (.*?)、別の区切り文字を使用して、パターン内のスラッシュをエスケープする必要がないようにします。

$TheLine =~ m<\s*(.*?)\s*=\s*(.*),\s*/\*(.*)\*/>
于 2012-12-21T11:09:19.690 に答える
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";
}
于 2012-12-21T15:44:41.640 に答える
0

記号の前の単語に=スペースが含まれていない場合は(.*)(\S+)

$TheLine =~ /\s*(\S+)\s*=\s*(.*),\s*\/\*(.*)\*\//)
           here __^
于 2012-12-21T11:08:24.367 に答える