2016-11-02 1 views
3

레일즈 4.2.7 (루비 2.3)을 사용하고 있습니다. 나는 각 번호는 분할이 발생한 위치의 인덱스를 나타내고있는 숫자의 동등한 배열을 얻을 수있는 방법 나는문자열을 분할 한 위치의 색인을 어떻게 알 수 있습니까?

my_string.split(/\W+/) 

내 질문은 정규 표현식에 따라 문자열을 분할하려면 다음을 사용할 수 있습니까? 분할이 발생하지 않으면 배열에 "-1"이 포함 된 요소 만 포함될 것으로 예상됩니다.

+0

. \ W +가 "-"와 일치 할 수 있습니까? –

답변

1

그래서, 당신은 분할하고 싶지 않다, 당신은 색인을 원합니까?

a = [] 
"Hello stack overflow".scan(/\W+/){a<<Regexp.last_match.begin(0)} 
a 
#=> [5, 11] 

빈 배열은 분할이 발생하지 않았다는 것을 의미합니다.

편집 : 짧은 버전은 여러 문자를 가진 문자열에 문자열을 분할 할 경우 String#split

"Hello stack overflow".enum_for(:scan, /\W+/).map{Regexp.last_match.begin(0)} 
#=> [5, 11] 
0

수 있습니다. 각 부분 문자열의 시작 부분에 대한 문자열로의 오프셋이 충분하지 않을 수 있습니다. 시작 색인과 종료 색인 모두 필요할 수 있습니다.

다음 메소드는 튜플의 배열을 리턴합니다. 각 튜플의 첫 번째 요소는 strip에 의해 리턴 된 문자열의 부분이며 두 번째 요소는 부분 문자열이 시작되는 인덱스입니다. 이 방법은 원하는 인덱스를 계산하는 방법을 제공하지만 split이 반환 한 하위 문자열도 반환합니다. 이 범위의 어레이를 얻는 것이 간단이 정보

def split_with_offsets(str, r) 
    indices = [] 
    str.scan(r) { indices << Regexp.last_match.begin(0) } 
    str.split(r).zip(indices << str.size).map { |s,ndx| [s, ndx-s.size] } 
end 

는 문자열의 오프셋되는 각각의 범위가되는 스트립이 분리된다.

def gaps(str, r) 
    split_with_offsets(str, r).each_cons(2).map { |(s,f), (_,lp1)| f+s.size..lp1-1 } 
end 

다음은 두 가지 예입니다.

# 1

str = "Hello stack overflow" 
r = /\W+/ 

split_with_offsets(str, r) 
    #=> [["Hello", 0], ["stack", 6], ["overflow", 12]] 
gaps(str, r) 
    #=> [5..5, 11..11] 

# 당신이 분할 정규식 1 개 이상의 문자가 문자열과 일치하는 경우 발생 원하는 작업이

str = "I | cannot | wait | for | the election |to |be | over" 
r = /\s*\|\s*/ 

split_with_offsets(str, r) 
    #=> [["I", 0], ["cannot", 4], ["wait", 13], ["for", 20], ["the election", 29], 
    # ["to", 43], ["be", 47], ["over", 53]] 
gaps(str, r) 
    #=> [1..3, 10..12, 17..19, 23..28, 41..42, 45..46, 49..52] 
관련 문제