2014-09-21 2 views
0

나는 string+,에 의해 또는 + IF , 또는 분할 시도하고있다가 " " 또는 ' ' 내에 있지 않은, 또는 + ""또는 ''내하지 않을 경우.분할 문자열로

예 :

print var1, "hello ,you "+var2

결과

print var1

hello ,you

var2

(?:,|\+)\s*(?=(?:['"].*['"])) 

하지만 어떻게 파악되지 않은 : 나는

내가 이런 일을 시작했습니다 ... 이것에 대한 regex 함께하려고 노력했지만 정말 아주 멀리 못 했어 다른 경우를 다룰 수 있습니다.

두 값을 기준으로 string을 분할하여 내가 원하는 결과를 얻을 수 있습니까?

도움 주셔서 감사합니다.

답변

5

당신이 좋아하는 정규식 사용할 수 있습니다

my @words = $line =~ /((?:[^,+"']+|"[^"]*"|'[^']*')+)/xg; 

을하지만 가능성이 Text::ParseWords 사용하는 것이 훨씬 청소기 것 :

use strict; 
use warnings; 

use Text::ParseWords; 

my $line = 'print var1, "hello ,you "+var2'; 

my @words = parse_line(qr{,\s*|\+}, 0, $line); 

use Data::Dump; 
dd @words; 

출력 :

("print var1", "hello ,you ", "var2") 
2
또는

, 당신이 수를 역행 동사를 사용하여 이것을하십시오.

use strict; 
use warnings; 
use Data::Dumper; 

my $re = qr/(?:"[^"]*"|'[^']*')(*SKIP)(*F)|[,+]\s*/; 

my $str = 'print var1, "hello ,you "+var2'; 
my @res = split($re, $str); 

print Dumper \@res; 

출력

$VAR1 = [ 
      'print var1', 
      '"hello ,you "', 
      'var2' 
     ]; 
+1

당신은'SKIP''F'의 사용을 설명 할 수 있으며 어떻게 작동하는지? – vks

관련 문제