리뷰

String # split 메소드를 사용하여 Ruby에서 문자열 분할

String # split 메소드를 사용하여 Ruby에서 문자열 분할

사용자 입력이 단일 단어 나 숫자가 아닌 한 해당 입력을 분할하거나 문자열 또는 숫자 목록으로 바꿔야합니다.

예를 들어, 프로그램이 중간 이니셜을 포함하여 전체 이름을 요구하는 경우 먼저 개별 입력 이름, 중간 이름 및 성으로 작업하기 전에 입력을 세 개의 개별 문자열로 분할해야합니다. 이것은 문자열 # 분할 방법.

String # split 작동 방식

가장 기본적인 형태로 문자열 # 분할 단일 인수, 즉 필드 구분 기호를 문자열로 사용합니다. 이 분리 문자는 출력에서 ​​제거되고 분리 문자에서 분할 된 문자열 배열이 리턴됩니다.

따라서 다음 예에서 사용자가 이름을 올바르게 입력하면 3 요소를 받아야합니다. 정렬 분할에서.

#! / usr / bin / env 루비
print "성명은 무엇입니까?"
full_name = gets.chomp
이름 = full_name.split ( ")
"이름은 # {name.first}입니다."
"이름은 # {name.last}입니다."

이 프로그램을 실행하고 이름을 입력하면 예상되는 결과가 나타납니다. 또한 이름 먼저 우연의 일치입니다. 그만큼 이름 변수는 정렬이 두 메소드 호출은 이름 0이름 -1 각기.

$ 루비 split.rb
전체 이름은 무엇인가? 마이클 C. 모린
당신의 이름은 마이클입니다
성은 Morin입니다

하나,문자열 # 분할 생각보다 조금 더 똑똑합니다. 만약에 문자열 # 분할 는 문자열이며 실제로 구분 기호로 사용하지만 인수가 하나의 공백이있는 문자열 인 경우 (여기서 사용 된 것처럼) 공백의 양에 상관없이 분리하고 싶다고 추론합니다. 선행 공백.

우리가 약간 잘못된 입력을 주면

마이클 C. 모린

(공백 추가) 문자열 # 분할 여전히 기대되는 것을 할 것입니다. 그러나, 당신이 통과하면 유일한 특별한 경우입니다 첫 번째 논쟁으로. 정규식 구분 기호

정규식을 첫 번째 인수로 전달할 수도 있습니다. 이리, 문자열 # 분할 좀 더 유연 해집니다. 작은 이름 분할 코드를 조금 더 똑똑하게 만들 수도 있습니다.

중간 이니셜이 끝나는 기간을 원하지 않습니다. 우리는 중간 초기 단계라는 것을 알고 데이터베이스는 마침표를 원하지 않으므로 분할하는 동안 데이터베이스를 제거 할 수 있습니다. 언제 문자열 # 분할 정규식과 일치하면 문자열 구분 기호와 일치하는 것과 똑같은 일을합니다. 출력에서 ​​꺼내어 그 시점에서 분리합니다.

따라서 예제를 약간 발전시킬 수 있습니다.

$ 고양이 split.rb
#! / usr / bin / env 루비
print "성명은 무엇입니까?"
full_name = gets.chomp
이름 = full_name.split (/ .? s + /)
"이름은 # {name.first}입니다."
"중간 이니셜은 # {name1}입니다"
"이름은 # {name.last}입니다."

기본 레코드 분리기

루비는 실제로 Perl과 같은 언어에서 볼 수있는 "특수 변수"에 크지 않지만 문자열 # 분할 알아야 할 것을 사용합니다. 이것은 기본 레코드 구분자 변수이며 $;.

루비에서는 흔히 볼 수없는 전역적인 코드이므로 변경하면 코드의 다른 부분에 영향을 줄 수 있습니다. 완료되면 다시 변경해야합니다.

그러나이 모든 변수는 첫 번째 인수의 기본값으로 작용합니다. 문자열 # 분할. 기본적으로이 변수는 . 그러나 문자열 # 분할첫 번째 주장은 단일 공백 ​​문자열로 바꿉니다.

길이가 0 인 구분자

구분자가 문자열 # 분할 길이가 0 인 문자열 또는 정규식입니다. 문자열 # 분할 조금 다르게 행동합니다. 원래 문자열에서 아무것도 제거하지 않고 모든 문자로 분할됩니다. 이것은 본질적으로 문자열을 문자열의 각 문자에 대해 하나씩, 한 문자 문자열 만 포함하는 동일한 길이의 배열로 바꿉니다.

이것은 문자열을 반복하는 데 유용 할 수 있으며 1.9.x 이전 및 1.8.7 이전 (1.9.x의 여러 기능을 백 포트)하여 문자열의 문자를 반복하지 않고 멀티- 바이트 유니 코드 문자. 그러나 실제로 원하는 작업이 문자열을 반복하고 1.8.7 또는 1.9.x를 사용하는 경우 아마도 문자열 #each_char 대신에.

#! / usr / bin / env 루비
str = "그녀는 나를 영원으로 바꿨습니다!"
str.split ( "). 각 do | c |
c를 넣는다
종료

반환 된 배열의 길이 제한

이름 구문 분석 예제로 돌아 가면 누군가성에 공백이 있으면 어떻게해야합니까? 예를 들어, 네덜란드 성은 종종 "van"( "of"또는 "from")으로 시작할 수 있습니다.

우리는 실제로 3 요소 배열 만 원하므로 두 번째 인수를 사용하여 문자열 # 분할 우리는 지금까지 무시했습니다. 두 번째 주장은 Fixnum. 이 인수가 긍정적 인 경우, 그 많은 요소가 배열에 채워집니다. 따라서이 경우이 인수에 3을 전달하려고합니다.

#! / usr / bin / env 루비
print "성명은 무엇입니까?"
full_name = gets.chomp
이름 = full_name.split (/ .? s + /, 3)
"이름은 # {name.first}입니다."
"중간 이니셜은 # {name1}입니다"
"이름은 # {name.last}입니다."

다시 실행하여 네덜란드어 이름을 지정하면 예상대로 작동합니다.

$ 루비 split.rb
전체 이름은 무엇인가? 빈센트 빌렘 반 고흐
당신의 이름은 Vincent입니다
당신의 중간 이니셜은 빌렘입니다
성은 반 고흐입니다

그러나이 인수가 음수 (음수)이면 출력 배열의 요소 수에는 제한이 없으며 후미 구분 기호는 배열 끝에 길이가 0 인 문자열로 나타납니다.

이것은이 IRB 스 니펫에서 설명됩니다.

: 001> "this, is, a, test ,,,,". split ( ',', -1)
=> "this", "is", "a", "test", "", "", "", ""