2016-06-24 2 views
0

"빈 줄 때까지 이동 "하는 뭔가를 실행 ". 내가 re = /^$/ 내가 "모든 후 '풋'캡처 가겠어요 어떻게 그래서 http://rubular.com/r/E5F7wH6sNq루비 정규 표현식 나는 다음과 같은 테스트 문자열이 한

"빈 줄을 캡처 "생각

[6] pry(main)> re = /[^"]+/ 
=> /[^"]+/ 
[7] pry(main)> "stuff before a quote\"".slice(re) 
=> "stuff before a quote" 

예처럼,"당신은 큰 따옴표로 실행할 때까지 간다 " 그리고 빈 줄에 올 때까지 "? 나는 다음 시도했다 :

re = /puts ([^^$]+)/ 

을하지만 그것은 작동하지 않았다 :

re = /puts (.*?)\r?\n\r?\n/m 

.*는 "제로 또는 더 의미 http://rubular.com/r/yUhA090fLm

답변

1
str.scan /(?<=puts).*?(?=\R\R|\z)/m                           
#⇒ [ 
# [0] "\"Wrong guess receives feedback\"\np (game.guess(11) == \"Too high!\")", 
# [1] "\"Wrong guess deducts from remaining guesses\"\np (game.remaining_guesses == 3)" 
# ] 

긍정적 인 lookbehind puts은/빈 줄 또는 입력의 끝 (\R에 승리와 맥 OS를 포함하여 모든 플랫폼을, 후자를 캡처 참고).

+0

'\ R'에 대해서는 전혀 몰랐습니다. 좋은 분! –

1

이 그것을 할 하나 개의 방법이 될 것입니다 문자는 개행을 제외하고 ". 나중에 ?을 설명하겠습니다.

끝에있는 "multiline"수식어는 "0"또는 "개행을 포함한 모든 문자"를 의미합니다.

\r?\n\r?\n은 한 줄에 두 개의 개행 문자가 있으며, 서로 다른 시스템에서 다르게 표현 될 수 있다는 사실을 설명합니다. 이 부분을 대신 $^으로 바꿀 수는 있지만, (.*?)은 마지막 줄 바꿈을 포함합니다. 왜냐하면 "끝 줄"에 대한 $이 전에 없었던 줄 바꿈 뒤에 일치하기 때문입니다.

?.*을 "게으르다"로 만듭니다. "게으름"을 피하고 최대한 일치시키는 대신 가능한 한 일치하지 않습니다. 빈 줄이 여러 개인 경우 관련이 있습니다. "마지막 빈 줄까지 모든 문자 중 0 개 이상"을 탐욕스럽게 사용하지 않기를 원할 것입니다. 당신은 lazily "첫 번째 빈 줄까지 모든 문자 중 0 개 이상"을 일치 시키길 원합니다.

/puts ([^^$]+)/의 문제점 중 하나는 [^abc]이 "a, b 또는 c가 아닌 모든 문자"에 대한 바로 가기라는 것입니다. "a '가 아니고'b '다음에'c '가 오는 것을 의미하지는 않습니다. 이 캐리지 리턴까지 비 욕심 아무것도 다음

+0

위의 내용은 Windows에서 작동하지 않습니다. – mudasobwa

+0

@ mudasobwa : 좋은 지적, 편집 됨. –

+0

Rails2 +에는'\ R' 정규 표현자가 있습니다. – mudasobwa

관련 문제