2009-09-01 4 views
1

나는 간단한 펄 스크립트를 사용하여 XML을 파싱하고 사용 가능한 SQL로 변환한다. 현재 SQL 행은 다음과 같습니다.공백 문제 Regex

INSERT INTO table VALUES ('data1', 'data2', 'data3',); 

분명히 끝에있는 쉼표를 제거해야합니다. 간단하게 들리지만 그냥 정규식을 찾을 수 없습니다. 나는 s/,\s+\)/\)/을 시도했지만 실행하면 아무 것도 바뀌지 않습니다. 이상하게도 s/,\s+/WTF/은 모든 쉼표와 그 옆의 공백을 바꿔야 할 때도 아무 것도 수정하지 않습니다. 하지만 s/\s+\)/something/을 실행하면 줄 끝의 닫는 괄호가 올바르게 검색되고 바뀝니다. 그래서 쉼표 바로 뒤에있는 공백 문자는 어떤 의미로도 찾을 수없는 이상한 유령입니다. . 표현으로도.

정말 대단한데, Notepad ++의 문서에서 Find를 정규 표현식 옵션과 함께 사용하면 ,\s+\)을 입력해도 완벽하게 찾을 수 있지만 Perl 정규 표현식에서 정확히 동일한 시퀀스는 찾지 못합니다.

은 내가 이전에 \n 문자를 제거하기 때문에 그것 (I Windows를 사용하고 있습니다) \r 뭔가를했다 의심하지만 전체 SQL 파일에 \r를 찾을 수 없습니다.

도움을 주셔서 감사합니다. 정말 저를 혼란스럽게합니다.

답변

8

첫째,

$ perl -E 'my $foo = "bar, baz"; $foo =~ s/,\s+/WTF/; say $foo' 
barWTFbaz 

그것은 작업을 수행합니다. (perl 5.8 이전의 경우 -e 및 print "$foo\n"으로 변경하십시오.

둘째, 잘못하고있는 것입니다. 대신 같은 일을의 :

$values = "'$values[0]', "; 
$values .= "'$values[1]', "; 
⋮ 

당신이해야 :

$values = join(q{,}, map("'$_'", @values)); # map adds 'quotes'; join adds commas 

셋째, 당신도 그렇게 안, 당신은 자리를 사용한다 : 어떤이 표현에 대한

# note specifying the column names, its a good idea! Schema change. 
my $query = "INSERT INTO table (col1, col2, col3) VALUES (?,?,?)"; 
my $sth = $dbh->prepare($query); 
$sth->execute(@values); 
+0

감사합니다. 피곤해. – RobbR