2013-04-21 3 views
2

SRT 자막 파일을 조작하려고합니다. 파일의 시작의 예 문자열 @data :루비 정규식은 처음 유효한 (?) 일치를 무시합니다

1 
00:01:09,611 --> 00:01:12,404 
In co-production with 

2 
00:01:14,783 --> 00:01:17,034 
presents 

내가 정규식으로 모든 id 's의 일치되었다 :

@data.scan(/^\d+\w*$/) 

그러나이 첫 번째 1를 무시 만 출력 2..900. 내가 정규식에서 일부 문자를 놓쳤다 생각하고 @data 분석 :이 첫 번째 1가 일치하지 않은 이유

puts @data[0,10].inspect => "1\n00:01:09,611 --> " 

내가 이해가 안 돼요. @data.match()으로 실행해도 1이 아니라 2이 산출됩니다.

그런 다음 1 앞에 \n을 추가하면 효과가있었습니다. 그러나 나는 왜 ^이 문자열의 실제 시작 대신 \n을 필요로하는지 이해하지 못합니다.

+0

문자열에'1'보다 이상한 문자가있는 것 같습니다. 'p @data [0, 10] .bytes'를 시도하십시오. 첫 번째 문자는 49가 아닙니다. – Dogbert

+1

문자열의 첫 번째 문자가 UTF-8의 바이트 순서 표시 인 것 같습니다 - http://en.wikipedia.org/wiki/Byte_order_mark – Dogbert

+0

'@data.scan (/^\ d + \ w * $ /)'는 내 환경에서'[ "1,"2 "]'를 제공합니다. – sawa

답변

2

@Dogbert가 주석에서 지적했듯이 문자열 시작 부분에 유니 코드 BOM이 있습니다. 나는 이것이 당신이 읽고있는 파일을 저작하는 프로그램의 유물이라고 생각합니다. 이 두 가지 방법으로 해결할 수 있습니다 - 문자 제거 :

@data = @data[1..-1] if @data[0] == "\ufeff" 
# or 
@data.sub!(/\A\ufeff/, '') 

또는 스캔의 정규 표현식은 긍정적 인 모습-뒤, 라인 앵커의 시작처럼 BOM을 치료합니다

@data.scan(/(?:^|(?<=\ufeff))\d+\w*$/) 

또는 틴 남자가 지적한대로, BOM 인식 데이터를 읽을 때로 루비 알려주기 : 읽을 때 문제가 문서의 BOM 인 경우

@data = File.read('somedata', nil, 0, 'r:BOM|UTF-8') 
+0

나는 이것이 사실이라고 추정한다. 지금은 인코딩에 대해 불평하고 utf로 저장 한 간단한 OSX 자막 편집기를 사용했기 때문에 생각합니다. 나는 그게 문제라고 생각한다. 처음에는 linebreak에 추가하여 작업했으나 정기적으로이 문제를 해결해야하는 경우 답안에 모든 옵션이 배치되어 있습니다. 수락 됨. – Peterdk

3

를, 루비는 멀티 바이트 인코딩을 사용과 함께 BOM에 대한 검사 지원 파일. 유니 코드 BOM에 대한 | "UTF16은-BE BOM은"사용, 루비 수표 "| | UTF-8 BOM", "BOM UTF-16LE는"또는

하면 다음 IO.new은 "IO 인코딩"문서에서 인코딩을 결정하는 데 도움이되는 입력 문서. UTF-16 인코딩의 경우 파일 열기 모드가 바이너리 여야합니다. 현재 BOM이 제거되고 BOM의 외부 인코딩이 사용됩니다. BOM이 없으면 주어진 유니 코드 인코딩이 ext_enc로 사용됩니다. (BOM-set 인코딩 옵션은 대소 문자를 구별하지 않으므로 "bom | utf-8"도 유효합니다.)

+1

+1 루비는 BOM – dbenhur

+1

BOM으로 옳은 일을하도록 지시받을 수 있습니다. BOM은 여러 번 내면에서 가시가되었습니다. 나는 입력 데이터에 쓰레기가 생길 때까지 내가 존재한다는 사실을 잊어 버릴 정도는 아니었다. 나는 Perl로 글을 쓸 때 그것들을 다루어야했는데 UTF-16 인코딩과 처음 접했을 때는 충격이었습니다 ... "이 둘은 모두 이진 ZEROS입니다!" :-) Ruby가 도움이 될만한 것을 보니 정말 좋았습니다. –

관련 문제