String
String
String 객체는 임의의 바이트 시퀀스를 가지며, 보통 텍스트나 이진 데이터를 나타내요. String::new이나 리터럴로 만들 수 있어요. Symbol 객체가 식별자용이라면, String은 텍스트·데이터용이에요.
출처: Ruby 3.3 API
본문
String 객체는 문자열 리터럴이나 히어독(heredoc) 리터럴로 만들 수 있고, 특정 객체를 String으로 변환할 수도 있어요.
이름이 !로 끝나는 메서드는 self를 수정하고 self를 돌려주는 경우가 많아요. 같은 이름의 ! 없는 메서드는 보통 새 문자열을 돌려줘요. 일반적으로 bang 버전이 있으면 bang이 변경(mutate)하고 non-bang은 변경하지 않아요. 다만 bang 없는 메서드도 변경할 수 있는데, String#replace가 그 예예요.
치환(Substitution) 메서드
치환을 수행하는 메서드들은 다음과 같아요.
String#sub: 치환 1회(또는 없음); 새 문자열을 돌려줘요.String#sub!: 치환 1회(또는 없음);self를 돌려줘요.String#gsub: 치환 0회 이상; 새 문자열을 돌려줘요.String#gsub!: 치환 0회 이상;self를 돌려줘요.
각 메서드는:
- 첫 인자
pattern(문자열 또는 regexp) — 교체될 부분 문자열을 지정해요. - 다음 중 하나:
- 두 번째 인자
replacement(문자열 또는 hash) — 교체 문자열을 결정해요. - 교체 문자열을 결정할 블록.
- 두 번째 인자
pattern은 흔히 정규 표현식이에요.
s = 'hello'
s.sub(/[aeiou]/, '*')# => "h*llo"
s.gsub(/[aeiou]/, '*') # => "h*ll*"
s.gsub(/[aeiou]/, '')# => "hll"
s.sub(/ell/, 'al') # => "halo"
'THX1138'.gsub(/\d+/, '00') # => "THX00"
pattern이 문자열이면 모든 문자가 일반 문자로 취급돼요(regexp 특수문자가 아님).
'THX1138'.gsub('\d+', '00') # => "THX1138"
문자열 replacement는 패턴의 캡처에 대한 역참조(back-reference)를 포함할 수 있어요. \n(n은 음이 아닌 정수)은 $n을, \k<name>은 이름 있는 캡처를 가리켜요. 또한 \&와 \0은 $&(전체 매치 텍스트), \'은 $'(매치 뒤 문자열), \`은 $``(매치 앞 문자열), +는 $+`(마지막 캡처 그룹)에 대응돼요. 블록 형태를 쓰면 백슬래시를 많이 피할 수 있어요.
replacement가 hash이고 pattern이 그 키 중 하나와 일치하면, 교체 문자열은 그 키의 값이에요. 블록 형태에서는 현재 매치 문자열이 블록에 전달되고 블록 반환값이 교체 문자열이 돼요.
h = {'foo' => 'bar', 'baz' => 'bat'}
'food'.sub('foo', h) # => "bard"
문자열의 공백 (Whitespace)
String 클래스에서 공백은 다음 문자의 연속 시퀀스로 정의돼요.
NL(null):"\x00","\u0000"HT(가로 탭):"\x09","\t"LF(라인 피드):"\x0a","\n"VT(세로 탭):"\x0b","\v"FF(폼 피드):"\x0c","\f"CR(캐리지 리턴):"\x0d","\r"SP(공백):"\x20"," "
공백은 lstrip/lstrip!(앞 공백 제거), rstrip/rstrip!(뒤 공백 제거), strip/strip!(앞뒤 공백 제거) 메서드와 관련돼 있어요.
문자열 슬라이스 (String Slices)
문자열의 슬라이스는 특정 기준으로 선택된 부분 문자열이에요. 이 인스턴스 메서드들이 슬라이싱을 사용해요.
String#[](별칭String#slice) —self에서 복사된 슬라이스를 돌려줘요.String#[]=— 슬라이스가 교체된self의 복사본을 돌려줘요.String#slice!— 슬라이스가 제거된self를 돌려줘요.
슬라이스를 결정하는 인자 형태는 여러 가지예요. 문자열 string에 대해:
string[index]string[start, length]string[range]string[regexp, capture = 0]string[substring]
예:
'bar'[0] # => "b"
'bar'[-1] # => "r"
'foo'[0, 2] # => "fo"
'foo'[1, 200] # => "oo"
'foo'[-2, 2] # => "oo"
'foo'[1, -1] # => nil (음수 length는 슬라이스 없음)
'foo'[4, 2] # => nil (start가 범위 밖)
여기에 있는 것 (What's Here)
String은 Object에서 상속받고 Comparable을 포함해요. 클래스 String은 다음에 유용한 메서드를 제공해요.
생성 및 frozen/비frozen
::new: 새 문자열을 돌려줘요.::try_convert: 주어진 객체에서 만든 새 문자열을 돌려줘요.+@: frozen이 아닌 문자열을 돌려줘요(self가 frozen이 아니면self, 아니면self.dup).-@: frozen 문자열을 돌려줘요.freeze:self를 frozen으로 만들어요.
조회(Querying)
개수: length, size(문자 수), empty?, bytesize(바이트 수), count(주어진 문자열과 일치하는 부분 문자열 수).
부분 문자열: =~, index, rindex, include?, match, match?, start_with?, end_with?.
인코딩: encoding, unicode_normalized?, valid_encoding?, ascii_only?.
기타: sum(각 바이트 합의 기본 체크섬), hash.
비교(Comparing)
==, ===(내용 동일 여부), eql?, <=>, casecmp, casecmp?.
문자열 수정(Modifying) — 모두 self를 수정해요
- 삽입:
insert,<<. - 치환:
sub!,gsub!,succ!,next!,replace,reverse!,setbyte,tr!,tr_s!. - 대소문자:
capitalize!,downcase!,upcase!,swapcase!. - 인코딩:
encode!,unicode_normalize!,scrub!,force_encoding. - 삭제:
clear,slice!,[]=,squeeze!,delete!,lstrip!,rstrip!,strip!,chomp!,chop!.
새 문자열로 변환(Converting to New String)
- 확장:
*,+,center,concat,prepend,ljust,rjust. - 인코딩:
b,scrub,unicode_normalize,encode. - 치환:
dump,undump,sub,gsub,succ/next,reverse,tr,tr_s,capitalize,downcase,upcase,swapcase. - 삭제/잘라내기:
chomp,chop,delete,delete_prefix,delete_suffix,lstrip,rstrip,strip,squeeze,slice. - 기타:
chr,replace,byteslice.
비문자열로 변환(Converting to Non-String)
bytes: 바이트 배열.chars: 문자 배열.codepoints: 코드포인트 배열.grapheme_clusters: 그래핌 클러스터 배열.lines(각 줄).to_s,to_str:self를 돌려줘요.to_sym/intern: 심볼.to_i,to_f,to_r,to_c: 숫자·복소수.hex,oct: 정수.ord(첫 문자의 코드포인트).split,scan,partition,rpartition: 부분 문자열 배열.unpack,unpack1: 바이트를 값으로 언팩.upcase등과 별개로,String#sum,String#each_*계열 등도 있어요.
반복(Iterating)
each_byte, each_char, each_codepoint, each_grapheme_cluster, each_line(또는 lines) — 블록으로 반복하고 열거자도 지원해요. upto는 주어진 문자열까지 성공 문자열을 반복해요.
주요 인스턴스 메서드 시그니처
다음은 클래스에서 자주 쓰는 메서드들의 시그니처예요.
String.new(string = '', encoding: nil, capacity: 0) → new_string
String.try_convert(object) → new_string or nil
string * integer → new_string
string + other_string → new_string
+string → self (non-frozen), -string → frozen string
string << object → self
string <=> other_string → -1, 0, +1, or nil
string == object → true or false (=== 별칭)
string =~ regexp → integer or nil
string[index] → substring or nil
string[start, length] → substring or nil
string[range] → substring or nil
string[regexp, capture = 0] → substring or nil
string[substring] → substring or nil
string[index] = new_string → new_string (및 []= 형태들)
ascii_only? → true or false
b → string
byteindex(substring, offset = 0) → integer or nil
byterindex(substring, offset = bytesize) → integer or nil
bytes → array_of_integers
bytesize → integer
byteslice(...) → substring or nil
capitalize(*options) → string / capitalize!(*options) → self or nil
casecmp(other_string) → -1, 0, +1, or nil
casecmp?(other_string) → true, false, or nil
center(width, pad_string = ' ') → new_string
chars → array_of_strings
chomp(separator = $/) → new_string / chomp! → self or nil
chop → new_string / chop! → self or nil
chr → string
clear → self
codepoints → array_of_integers
concat(*objects) → new_string
count(*selectors) → integer
crypt(salt) → new_string (구식)
dedup → self
delete(*selectors) → new_string / delete! → self or nil
delete_prefix(prefix) → new_string / delete_prefix!(prefix) → self or nil
delete_suffix(suffix) → new_string / delete_suffix! → self or nil
downcase(*options) → string / downcase! → self or nil
dump → string
each_byte {|byte| ... } → self
each_char {|c| ... } → self
each_codepoint {|int| ... } → self
each_grapheme_cluster {|str| ... } → self
each_line(separator = $/, chomp: false) {|substring| ... } → self
empty? → true or false
encode(*encodings, **options) → string / encode! → self
encoding → encoding
end_with?(*strings) → true or false
eql?(object) → true or false
force_encoding(encoding) → self
getbyte(index) → integer or nil
grapheme_clusters → array_of_strings
gsub(pattern, replacement) → new_string / gsub(pattern) {|match| ... } → new_string / gsub!(...)
hash → integer
hex → integer
include?(other_string) → true or false
index(substring, offset = 0) → integer or nil
insert(index, other_string) → self
inspect → string
intern → symbol
length → integer (size 별칭)
lines(separator = $/, chomp: false) → array_of_strings
ljust(width, pad_string = ' ') → new_string
lstrip → new_string / lstrip! → self or nil
match(pattern, offset = 0) → matchdata or nil
match?(pattern, offset = 0) → true or false
next → new_string / next! → self (succ 별칭)
oct → integer
ord → integer
partition(separator) → [head, separator, tail] (또는 regexp/string)
prepend(*other_strings) → self
replace(other_string) → self
reverse → new_string / reverse! → self
rindex(substring, offset = 0) → integer or nil
rjust(width, pad_string = ' ') → new_string
rpartition(separator) → [head, separator, tail]
rstrip → new_string / rstrip! → self or nil
scan(pattern) → array / scan(pattern) {|match| ... } → self
scrub(replacement_string = default) → new_string / scrub! → self
setbyte(index, integer) → integer
slice(index) → substring or nil ([] 별칭)
slice!(index) → substring or nil (등 여러 형태)
split(separator = $;, limit = nil) → array_of_strings
squeeze(*selectors) → new_string / squeeze! → self or nil
start_with?(*prefixes) → true or false
strip → new_string / strip! → self or nil
sub(pattern, replacement) → new_string / sub(pattern) {|match| ... } → new_string / sub!(...)
succ → new_string / succ! → self (next 별칭)
sum(bits = 16) → integer
swapcase(*options) → string / swapcase! → self or nil
to_c → complex
to_f → float
to_i(base = 10) → integer
to_r → rational
to_s → self (to_str 별칭)
to_sym → symbol (intern 별칭)
tr(select, replacements) → new_string / tr!(select, replacements) → self or nil
tr_s(select, replacements) → new_string / tr_s!(select, replacements) → self or nil
undump → string
unicode_normalize(form = :nfc) → string / unicode_normalize!(form = :nfc) → self
unicode_normalized?(form = :nfc) → true or false
unpack(template) → array
unpack1(template) → object
upcase(*options) → string / upcase! → self or nil
upto(other_string, exclusive = false) {|s| ... } → self
valid_encoding? → true or false
추가로,
kconv관련 메서드(toeuc,tojis,tosjis,tolocale,toutf8,toutf16,toutf32,iseuc,isjis,issjis,isutf8)는 문자 코드 변환용이고,shellescape·shellsplit은 Shellwords 모듈에서 제공돼요.