정규 표현식을 사용하여 Ruby의 문자열에서 부분 문자열 추출


130

Ruby의 문자열 내에서 하위 문자열을 추출하려면 어떻게해야합니까?

예:

String1 = "<name> <substring>"

나는 추출 할 substring에서 String1(마지막에 출현 내 즉 모든 <>).

답변:


134
String1.scan(/<([^>]*)>/).last.first

scan캡처 그룹을 포함하는 정규식과 함께 사용될 때 scan은 각 일치에 대한 캡처를 포함하는 배열을 만듭니다)는 각각 <item>String1대해 <>요소 사이에 텍스트를 포함하는 배열을 만듭니다. last마지막 배열 first을 제공 하고 그 안에 문자열을 제공합니다.


319
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"

scan결과가 하나만 필요한 경우을 사용할 필요가 없습니다 . Ruby가있을 때
Python을 사용할 필요가 없습니다 .matchString[regexp,#]

참조 : http://ruby-doc.org/core/String.html#method-i-5B-5D

노트 : str[regexp, capture] → new_str or nil


37
다른 완벽하게 유효한 (그리고 더 읽기 쉽고 더 읽기 쉬운) 솔루션을 신뢰할 필요가 없습니다.
coreyward

41
@coreyward, 그들이 더 낫다면, 그것을 주장하십시오. 예를 들어 sepp2k의 솔루션이 더 유연하기 때문에 if we need only one result솔루션을 지적 했습니다. 그리고 match()[]하나가 아닌 두 가지 방법이기 때문에 속도가 느립니다.
Nakilon

4
이것은 제시된 모든 방법 중 가장 빠르지 만 가장 느린 방법조차도 내 컴퓨터에서 4.5 마이크로 초 밖에 걸리지 않습니다. 이 방법이 더 빠른 이유를 추측하지는 않습니다. 성능에서 추측은 쓸모없습니다 . 측정 만 계산합니다.
Wayne Conrad

8
나는이 솔루션을보다 간단하고 요점을 발견했다 (루비를 처음 사용하기 때문에). 감사.
Ryan H.

@Nakilon의 가독성은 제품 및 팀의 전반적인 성공을 고려할 때 작은 성능 차이를 능가 할 수 있으므로 핵심 의견은 유효합니다. 즉, string[regex]이 시나리오에서 읽을 수있는 것처럼 생각 하기 때문에 개인적으로 사용했습니다.
Nick

24

정규 표현식을 아주 쉽게 사용할 수 있습니다…

단어 주위에 공백을 허용하지만 공백을 유지하지는 마십시오.

str.match(/< ?([^>]+) ?>\Z/)[1]

또는 공백이 허용되지 않은 경우 :

str.match(/<([^>]+)>\Z/)[1]

1
마지막이 <>실제로 문자열에서 마지막이어야 하는지 확실하지 않습니다 . 예를 들어 문자열 foo <bar> baz이 허용되고 결과를 제공 해야하는 bar경우 작동하지 않습니다.
sepp2k

방금 그가 제공 한 샘플 문자열을 기반으로했습니다.
coreyward

10

이 방법을 사용하는 약간 더 유연한 접근법이 match있습니다. 이를 통해 둘 이상의 문자열을 추출 할 수 있습니다.

s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)

# Use 'captures' to get an array of the captures
matchdata.captures   # ["ants","pants"]

# Or use raw indices
matchdata[0]   # whole regex match: "<ants> <pants>"
matchdata[1]   # first capture: "ants"
matchdata[2]   # second capture: "pants"

3

보다 간단한 스캔은 다음과 같습니다.

String1.scan(/<(\S+)>/).last
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.