2011-01-20 8 views
1

가정하자 내가 가진 :캡처 임의의 하나 '/'전에 문자열이나 문자열의 끝

foo/fhqwhgads 
foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar 

그리고 나는 '경우,'푸/'I 중 하나를 손'/ '까지 다음 모든 것을 교체하거나 할/'는 절대로 도달하지 못하고 줄의 끝까지 도달합니다. 첫 번째 부분에서는 다음과 같이 비 캡처 그룹을 사용할 수 있습니다.

(?<=foo\/).+ 

그리고 여기서 내가 붙어 있습니다. 나는 '/'과 같이 두 번째에 일치 수 : 비록 첫 번째 경우에 도움이되지 않습니다

(?<=foo\/).+(?=\/) 

. 원하는 출력 :

foo/blah 
foo/blah/bar 

Ruby를 사용하고 있습니다.

답변

3

이 정규식을 시도해보십시오

/(?<=foo\/)[^\/]+/ 
+0

이것은 짧고 달다. 감사! –

+0

Meh, 비 캡처 그룹이 필요하지 않습니다. – noodl

0

나는 루비 개발자가 아니지만 php의 explode()에 상응하는 부분이 있으므로 문자열을 폭발시키고 두 번째 배열 색인에 새 항목을 삽입 한 다음 /를 다시 삽입 할 수 있습니다. 물론 물론 어떤 경우에만 스위치를 원할 경우 첫 번째 배열 요소에서 일치 할 수 있습니다.

+1

'분할 ('/')'와'조인 ('/') '. –

0

문자열 끝 앵커 - $ - 및 / 문자를 확인하는 것이 트릭을 수행해야합니다. 욕심이 많은 버전은 항상 주어진 문자열의 끝까지 일치하므로 기회가 주어지면 .+.+?으로 변경하여 욕심이 없어야합니다.

(?<=foo\/).+?(?=\/|$) 
+0

시도해 보았지만 나에게 도움이되지 않았습니다. 캡처 된 그룹의 일부로 /와 모든 것을 처리했습니다. –

+0

@Ben :이 경우 캡쳐를 욕심이 없도록 만들 필요가 있습니다 ('? '를 붙임으로써). 나는 편집 할 것이다 ... – LukeH

0
['foo/fhqwhgads', 'foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar'].each do |s| 
    puts s.sub(%r|^(foo/)[^/]+(/.*)?|, '\1blah\2') 
end 

출력 :

foo/blah 
foo/blah/bar 

내가 그것을 할 수있는 더 좋은 방법을 생각 너무 피곤하지만, 내가 거기에 확신 하나입니다. Endophage의 대답 @ 구현

1

:

루비가 지원
def fix_post_foo_portion(string) 
    portions = string.split("/") 
    index_to_replace = portions.index("foo") + 1 
    portions[index_to_replace ] = "blah" 
    portions.join("/") 
end 

strings = %w{foo/fhqwhgads foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar} 
strings.each {|string| puts fix_post_foo_portion(string)} 
관련 문제