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)

StringObject에서 상속받고 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 모듈에서 제공돼요.