2013-10-04 3 views
1

내가 한 줄에 빈 문자열을 제거하는 정규식을 작성하려고 해요 (및 목록 항목 사이의 공백에 대해 상관하지 않는다)를 제거합니다 : baz foo, "","", bar, "" 지금까지 내가 'baz foo, bar펄 정규식 예를 들어 빈 문자열

된다

$newLine =~ s/""\s*?,//g; 
$newLine =~ s/,\s*?""//g; 

을 시도하고 있지만 baz foo, "" 반환 baz "", foo, ""을 주어,하지만 난 그것을 baz foo을 반환 할거야.

누구나 무슨 일이 일어나고 있는지/어떻게 해결할 수 있습니까?

답변

1

귀하의 코드는 나를 위해 작동

감사 :

$string = 'baz "", foo, ""'; 
$string =~ s/""\s*?,//g; 
$string =~ s/,\s*?""//g; 
print "$string\n"; 

반환 나를 위해

baz foo 

.

편집 : 아래 설명에 명시된 바와 같이 baz "", "" 문자열에는 작동하지 않습니다. 왜냐하면 첫 번째 정규식은 두 번째 정규식이 일치하지 않기 때문에 두 번째 "" 앞에 ,을 사용하기 때문입니다.

정규 표현식 대신 map을 사용하는 것이 좋습니다. $string

+0

글쎄, 그가 제공 한 코드를 사용하여, 나를 위해 않았다. 그것은 그가'baz ", foo,"''입력으로부터 필요한 결과물로서 그가 묘사 한 바를 정확하게 반환했다. – Vince

+0

아, 이제 알겠습니다. 좋아, 나는 그것을 나의 대답에 추가 할 것이다. – Vince

1

그것은 문자열을 분할 쉽게 baz foo에, "" (및 주변 공간)에서 떨어져 모든 것을 포함하고 그 뒷면에 가입하지 않는 요소를 제거 설정합니다

$string = 'baz "", "", foo'; 
$string = join(" ", map { $_ =~ s/\s*""\s*//g; $_; } (split(/\s*,\s*/, $string))); 

.

하는 당신을 위해 작동 할 수 있습니다 다음

@foo = grep { !/\s?""\s?/ } split /,/, $newLine; 
$newLine = join(',', @foo); 

예 :

$ cat mmm 
$newLine = 'baz foo, "","", bar, ""'; 
@foo = grep { !/\s?""\s?/ } split /,/, $newLine; 
$newLine = join(',', @foo); 
print $newLine . "\n"; 
$ perl mmm 
baz foo, bar