2012-01-29 2 views
2

notes에서 example_header (으)로 시작하는 모든 항목을 삭제하고 싶습니다. 내가하려고 노력 :루비에서 "gsub"를 사용하여 파이프를 삭제하지 않는 이유는 무엇입니까?

example_header = <<-EXAMPLE 
    ----------------- 
    ---| Example |--- 
    ----------------- 
EXAMPLE 

notes = <<-HTML 
    Hello World 
    #{example_header} 
    Example Here 
HTML 

puts notes.gsub(Regexp.new(example_header + ".*", Regexp::MULTILINE), "") 

을하지만 출력은 다음과 같습니다

Hello World 
    || 

왜 삭제되지 않습니다 ||?

답변

7

정규식의 파이프가 alternation operator으로 해석됩니다. 정규 표현식은 다음과 같은 세 가지 문자열을 대체합니다 :

"-----------------\n---" 
" Example " 
"---\n-----------------" 
정규 표현식 ( ideone)에서 사용할 때 문자열을 탈출 Regexp.escape를 사용하여 문제를 해결할 수 있습니다

:

puts notes.gsub(Regexp.new(Regexp.escape(example_header) + ".*", 
          Regexp::MULTILINE), 
       "") 

당신은 할 수 또한 정규 표현식을 피하고 대신 일반 문자열 메서드 (ideone)를 사용하는 것을 고려하십시오.

puts notes[0, notes.index(example_header)] 
+0

고마워요! 정규 표현식없이 동일한 방법을 제안 해 주시겠습니까? –

+1

@Phrogz : Misha가 헤더 * 및 그 이후의 모든 것을 삭제하려고하기 때문에 작동하지 않습니다. –

3

파이프는 regexp 구문의 일부이며 "또는"를 의미합니다. 일치시킬 실제 문자로 간주하려면 백 슬래시로 이스케이프 처리해야합니다.

관련 문제