레일즈 4.2.7 (루비 2.3)을 사용하고 있습니다. 나는 각 번호는 분할이 발생한 위치의 인덱스를 나타내고있는 숫자의 동등한 배열을 얻을 수있는 방법 나는문자열을 분할 한 위치의 색인을 어떻게 알 수 있습니까?
my_string.split(/\W+/)
내 질문은 정규 표현식에 따라 문자열을 분할하려면 다음을 사용할 수 있습니까? 분할이 발생하지 않으면 배열에 "-1"이 포함 된 요소 만 포함될 것으로 예상됩니다.
레일즈 4.2.7 (루비 2.3)을 사용하고 있습니다. 나는 각 번호는 분할이 발생한 위치의 인덱스를 나타내고있는 숫자의 동등한 배열을 얻을 수있는 방법 나는문자열을 분할 한 위치의 색인을 어떻게 알 수 있습니까?
my_string.split(/\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]
수 있습니다. 각 부분 문자열의 시작 부분에 대한 문자열로의 오프셋이 충분하지 않을 수 있습니다. 시작 색인과 종료 색인 모두 필요할 수 있습니다.
다음 메소드는 튜플의 배열을 리턴합니다. 각 튜플의 첫 번째 요소는 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]
. \ W +가 "-"와 일치 할 수 있습니까? –