루비 문자열에서 마지막 n 개 문자 추출


105

n문자열에서 마지막 문자 를 얻으려면 다음을 사용할 수 있다고 가정했습니다.

ending = string[-n..-1]

그러나 문자열이 n글자 보다 짧으면 nil.

어떤 해결 방법을 사용할 수 있습니까?

배경 : 문자열은 일반 ASCII이며 ruby ​​1.9.1에 액세스 할 수 있으며 Plain Old Ruby Objects (웹 프레임 워크 없음)를 사용하고 있습니다.

답변:


99

여기에 하나의 라이너가 있으며 문자열 크기보다 큰 숫자를 넣을 수 있습니다.

"123".split(//).last(5).to_s

루비 1.9 이상

"123".split(//).last(5).join("").to_s

루비 2.0+의 경우 join은 문자열을 반환합니다.

"123".split(//).last(5).join

19
최신 버전의 Ruby를 사용하는 경우 chars분할 대신 사용할 수 있습니다 .
Andrew Grimm

1
나는 "12345678910".split (//). last (7) .join.to_s
Hard-Boiled Wonderland를 사용

@ Hard-BoiledWonderland가 join작동합니다. to_s조인을 사용 하면 마지막이 필요하지 않다고 생각합니다 .
Andrew Grimm

@AndrewGrimm 맞습니다. 위의 Nokogiri n.xpath('ReferenceID').inner_text.split(//).last(7).join.to_s.to_i를 사용하여 숫자 값을 추출하기 위해 to_i를 수행하려면 to_s가 필요했습니다.
Hard-Boiled Wonderland

.join 이 누락되었습니다. 이제 문자열 배열을 반환합니다. 대신이 있어야한다 "123".split(//).last(5).join(루비 2.0.0)
파벨 니콜 로프

115

제가 생각할 수있는 가장 쉬운 해결 방법은 다음과 같습니다.

ending = str[-n..-1] || str

(편집 : or연산자는 할당보다 우선 순위가 낮으므로 ||대신 사용하십시오 .)


+1 ...이 방법이보다 읽기 쉽다고 생각합니다. string.reverse[0..n].reverse"잠깐만 요, 왜 그렇게하는 거죠?" (또는이 질문의 맥락에서 그것을 읽는되지 않은 것입니다 경우)
Arkaaito

4
좋은 대답이지만 ||대신 or이거나 괄호로 묶어야합니다 str[-n..-1] or str.
Andrew Grimm

좋은 대답이지만, 루비가 s [-inf ..- 1]를 x [0..inf]와 동일하게 취급하지 않는 것이 싫습니다
klochner

연산자 우선 순위 문제에 대해 알려 주셔서 감사합니다, Andrew. 매번 나를 가져옵니다.
perimosocordiae 2010

@perimosocordiae 당신은 유일한 사람이 아닙니다. stackoverflow.com/questions/372652/…
Andrew Grimm

51

직선 Ruby (Rails 제외)에서는 다음을 수행 할 수 있습니다.

string.chars.last(n).join

예를 들면 :

2.4.1 :009 > a = 'abcdefghij'
 => "abcdefghij"
2.4.1 :010 > a.chars.last(5).join
 => "fghij"
2.4.1 :011 > a.chars.last(100).join
 => "abcdefghij"

Ruby on Rails를 사용하는 경우 메서드 firstlast문자열 객체를 호출 할 수 있습니다 . 이러한 방법은 간결하고 직관적이기 때문에 선호됩니다.

예를 들면 :

[1] pry(main)> a = 'abcdefg'                                                                                                                
 => "abcdefg"
[2] pry(main)> a.first(3)                                                                                                                   
 => "abc"
[3] pry(main)> a.last(4)                                                                                                                    
 => "defg"

1
Ruby는 Rails를 의미하지 않습니다.
방향 전환

14
ending = string.reverse[0...n].reverse

이것은 전체 문자열 길이를 초과하는 끝 문자 길이를 제공 할 수 있어야한다는 요구 사항을 충족하는이 페이지에서 볼 수있는 최선의 방법입니다.
Rob.Kachmar 2013-08-08

1
예를 들어, "abcde", "ab"및 "a"와 같은 스팅 그룹의 마지막 3 개 문자를 사용하려는 경우. 이 기법을 사용하면 "cde", "ab"및 "a"가 각각에 대해 동일한 코드를 사용합니다. "abcde".reverse[0,3].reverse>>> "cde" "ab".reverse[0,3].reverse>>> "ab" "a".reverse[0,3].reverse>>> "a"
Rob.Kachmar 2013-08-08

9

다음 코드를 사용할 수 있습니다.

string[string.length-n,string.length]

1
코드 전용-답변이 항상 도움이되는 것은 아닙니다. 이유는 /이 코드가 얼마나 수정이 좋을 것 설명
ry8806

6

문자열에서 마지막 n 개의 문자를 얻으려면 다음을 수행 할 수 있습니다.

a가 배열이면 a [-n, n].

원하는 경우 여기와 예가 있습니다.

루비 -1.9.2-p180 : 006> a = "911234567890"

=> "911234567890"

루비 -1.9.2-p180 : 009> a [-5,5]

=> "67890"

루비 -1.9.2-p180 : 010> a [-7,7]

=> "4567890"


숫자가 너무 크면 nil이 질문이 특별히 피하려고 한 것입니다.
Andrew Grimm 2011 년

좋은 대답입니다. 깨끗한.
방향 전환

왜 이것이 찬성 투표를 받고 있습니까? OP가 수정 방법을 묻는 것과 똑같은 문제가 있습니다.
jeffdill2

5

정규식을 사용해 보셨습니까?

string.match(/(.{0,#{n}}$)/)
ending=$1

정규식은 문자열 끝에서 가능한 한 많은 문자를 캡처하지만 n 개를 넘지 않습니다. 그리고 $ 1에 저장합니다.


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