2015-01-15 7 views
1

줄 바꿈에 걸쳐 욕심 매칭 다음정규식이 아닌 내가 일치하도록 노력하고

str = "---title: Some Title\ndate: 01/01/2012---\n\nSome other stuff---\n\n" 

그리고 나는 좀하고 싶습니다 :

"title: Some Title\ndate: 01/01/2012" 

그래서 생각 해낸 정규식이었다 :

~r/---(.+)---(.+)/s 

불행히도 탐욕과 일치가 있습니다.

"title: Some Title\ndate: 01/01/2012---\n\nSome other stuff" 

(10)는 또한 비 욕심 조작을 시도하고도 실패

(~r/---(.+)---(.+)?.*/s 

모든 제안은 매우 도움이 될 것입니다.

감사

+0

Perl과 PCRE 태그는 germaine이 아니기 때문에 제거했습니다. –

+0

PCRE 정규식 엔진이있는 Elixir을 사용하고 있으므로 PCRE'ish 솔루션을 찾고있었습니다. 따라서 태그. – user3118605

답변

0

더 일반적인 정규식은 다음과 같습니다 값 :

(?:---)?(?<key>[a-z]+)\s*:\s*(?<value>(?!\\n).+?)(?:\\n|---|$) 

그것은 키에서 경기를 분할합니다.

DEMO

+1

감사. 제목과 날짜가 있어야한다는 일반적인 해결책을 찾고있었습니다. 나는 --- --- (여기에 어떤 것들) --- 사이에있는 무엇이든 작동하도록하고 싶습니다. – user3118605

2

사용 string.scan 기능.

> str = "---title: Some Title\ndate: 01/01/2012---\n\nSome other stuff---\n\n" 
> str.scan(/---([\s\S]+?)---/)[0][0] 
=> "title: Some Title\ndate: 01/01/2012" 

위의 스캔 기능의 출력은 캡처 그룹이 있기 때문에 2 차원 배열입니다. [\s\S]+? 하나 이상의 공백 또는 공백이 아닌 문자를 탐욕에 빠뜨리지 않습니다. 이 패턴은 줄 바꿈에도 일치합니다 (\n, \r).

0

여기서 올바른 방법은 추출하려는 부분과 일치시키지 말고 던져 넣으려는 부분과 일치시키고 split을 사용하는 것입니다. 당신이 궁극적으로 제목과 날짜 문자열을 원하는 경우

s.split(/---\n*/) 
#=> ["", "title: Some Title\ndate: 01/01/2012", "Some other stuff"] 

str.split(/---\n*/)[1] 
#=> "title: Some Title\ndate: 01/01/2012" 
+0

고마워, 나는 진짜로 성냥 포착 해결책을 찾고 있었다. – user3118605

0

, 당신은뿐만 아니라 직접 당겨 수 있습니다

str.scan(/---title:\s+([^\n]+)\ndate:\s+(\d{2}\/\d{2}\/\d{4})/) 
    #=> [["Some Title", "01/01/2012"]] 
+0

여기에 좀 더 자세히 살펴볼 필요가 없습니다. 'date :'부분을 사용하는 것처럼 그 부분을 정상적인 방법으로 일치시키고 무시하십시오. –

+0

고마워, 앨런. 나는 그것을 고쳤다. 작은 일이지만 lookie를 제거하면'title : \ s'을'title : \ s +'로 바꿀 수있었습니다. [독자 : 저는 이전에'(? <--- title : \ s)'은 ("제로 너비") "긍정적 인 lookbehind"]입니다. –

0

펄 방법은 그것을 할 :

#!/usr/bin/perl 
use Modern::Perl; 

my $str = "---title: Some Title\ndate: 01/01/2012---\n\nSome other stuff---\n\n"; 
$str =~ s/---(.+?)---.*?$/$1/s; 
say $str; 

출력 :

title: Some Title 
date: 01/01/2012 
+0

정말 멋지다! 나는 비 탐욕적인 운영자와 새로운 라인을 가로 지르는 일부 일치를 사용해야 만한다는 것을 알았다. 궁금 해서요, 왜 우리는 두 번째가 필요합니까? " "$"전에? 가지고있을만큼 충분하지 않습니까? '~ r /---(.+?)---.*$/ s' 고마워! – user3118605

+0

또한 욕심을 느끼지 않아도 되나요? 나는 단지'regex = ~ r/--- ([^ - {3}] +) ---. * $/s'을 할 수 없습니까? – user3118605

관련 문제