2017-03-12 19 views
2

私はperlで文字列を解析し、その配列を配列に入れようとしています。Perlの正規表現に複数の空白行があります

Ex。 "FUNC1(VALUE1)VALUE1、VALUE2、FUNC2(FUNC1(VALUE3))VALUE3、VALUE4、FUNC3(VALUE5)VALUE5"

出力:

FUNC1(VALUE1) VALUE1 
VALUE2 
FUNC2(FUNC1(VALUE3)) VALUE3 
VALUE4 
FUNC3(VALUE5) VALUE5 

マイコード:

my $in = "FUNC1(VALUE1) VALUE1, VALUE2, FUNC2(FUNC1(VALUE3)) VALUE3, VALUE4, FUNC3(VALUE5) VALUE5"; 

my @cols = ($in =~ /((?&full_m)),? 
(?(DEFINE) 
      (?<full_m>(?&full_f)|(?&word)) 
      (?<full_f>(?&func)\s(?&word)) 
      (?<func>(?&word)\((?&worf)\)) 
      (?<worf>(?&func)|(?&word)) 
      (?<word>\s*\w+\s*) 
     )/gx); 
print "$in\n"; 

my $count = 1; 
foreach (@cols) { 
    print "$count: $_\n"; 
    ++$count; 
} 

問題は私がマッチを得るだけでなく、5つの空のマッチを得ることです。

1: FUNC1(VALUE1) VALUE1 
2: 
3: 
4: 
5: 
6: 
7: VALUE2 
8: 
9: 
10: 
11: 
12: 
13: FUNC2(FUNC1(VALUE3)) VALUE3 
14: 
15: 
16: 
17: 
18: 
19: VALUE4 
20: 
21: 
22: 
23: 
24: 
25: FUNC3(VALUE5) VALUE5 
26: 
27: 
28: 
29: 
30: 
+0

を必要とされているがあなたの代わりにそこにある 'word'の' worf'を持つことを意味していましたか? – Amber

+0

'@ cols'の結果は、完全一致を含みますが、あなたのパターンで定義した各グループの内容も含みます。だからあなたは5つの空のアイテムを手に入れます。 –

+0

なぜそれもグループを持っていますか?私はそれが括弧の中に何が表示されるだけだろうと思ったのですか? – perlnoob

答えて

1

これは、グループ1をcolの配列に格納する以外は同じことです。より良い正規表現を表示するには

my $in = "FUNC1(VALUE1) VALUE1, VALUE2, FUNC2(FUNC1(VALUE3)) VALUE3, VALUE4, FUNC3(VALUE5) VALUE5"; 
my @cols; 
while ($in =~ /((?&full_m)),?(?(DEFINE)(?<full_m>(?&full_f)|(?&word))(?<full_f>(?&func)\s(?&word))(?<func>(?&word)\((?&worf)\))(?<worf>(?&func)|(?&word))(?<word>\s*\w+\s*))/gx) 
{ 
    push @cols, $1; 
} 
print "$in\n"; 

my $count = 1; 
foreach (@cols) { 
    print "$count: $_\n"; 
    ++$count; 
} 

出力

FUNC1(VALUE1) VALUE1, VALUE2, FUNC2(FUNC1(VALUE3)) VALUE3, VALUE4, FUNC3(VALUE5) VALUE5 
1: FUNC1(VALUE1) VALUE1 
2: VALUE2 
3: FUNC2(FUNC1(VALUE3)) VALUE3 
4: VALUE4 
5: FUNC3(VALUE5) VALUE5 

、書式設定が

((?&full_m))    # (1) 
,? 
(?(DEFINE) 
     (?<full_m>     # (2 start) 
      (?&full_f) 
     | (?&word) 
    )        # (2 end) 
     (?<full_f>     # (3 start) 
      (?&func) \s (?&word) 
    )        # (3 end) 
     (?<func>      # (4 start) 
      (?&word) \((?&worf) \) 
    )        # (4 end) 
     (?<worf>      # (5 start) 
      (?&func) 
     | (?&word) 
    )        # (5 end) 
     (?<word> \s* \w+ \s*)  # (6) 
) 
+0

ありがとうございました!私はまだ私のバージョンにマッチしたグループがなぜ追加されたのかは分かりません。 – perlnoob

+0

フォーマット済みの正規表現を見て、他のグループは '@ary = $ s〜= // g;'を実行したときに記録されます。ただし、(?(DEFINE)から)関数としてグループを呼び出すと、そのグループの値は上書きされますが、その一致が呼び出し側に返されます。 – sln

+0

もう一度簡単に説明していただきありがとうございます! – perlnoob