본문 바로가기
Developer/Ruby

Ruby String sub / gsub / sub! / gsub! 사용 방법 (루비 문자열 치환하는 방법)

by 김씩씩 2022. 9. 15.

Ruby String sub / gsub / sub! / gsub! 사용 방법 (루비 문자열 치환하는 방법)

 

Ruby에서 문자열을 치환할 때 사용하는 메소드 sub / gsub / sub! / gsub! 의 사용 방법에 대해 알려드리도록 하겠습니다.

 

sub 사용 방법

str = "공일공-일이삼-사오육-칠팔구"

p str.sub("-", "/")  # "공일공/일이삼-사오육-칠팔구"

p str.sub(/[공일이삼사오육칠팔구]/, "X")  # "X일공-일이삼-사오육-칠팔구"

numbers = {
  "공" => "0",
  "일" => "1",
  "이" => "2",
  "삼" => "3",
  "사" => "4",
  "오" => "5",
  "육" => "6",
  "칠" => "7",
  "팔" => "8",
  "구" => "9",
}
p str.sub(/[공일이삼사오육칠팔구]/, numbers)  # "0일공-일이삼-사오육-칠팔구"
p str.sub(/[공일이삼사오육칠팔구]/) { |match| numbers[match] }  # "0일공-일이삼-사오육-칠팔구"

 

sub(pattern, replacement) -> new String

sub(pattern) { |match| match에 따른 반환값 설정 } -> new String

방식으로 sub를 사용하여 문자열을 치환할 수 있습니다.

 

sub를 사용하여 문자열을 치환하면 pattern에 해당하는 문자열 중 앞에서부터 가장 먼저 일치하는 문자열만 변경합니다.

만약 한개의 문자열이 아닌 전체를 변경하고 싶다면 다음에 설명드릴 gsub를 사용하시면 됩니다.

 

 

gsub 사용 방법

str = "공일공-일이삼-사오육-칠팔구"

p str.gsub("-", "/")  # "공일공/일이삼/사오육/칠팔구"

p str.gsub(/[공일이삼사오육칠팔구]/, "X")  # "XXX-XXX-XXX-XXX"

numbers = {
  "공" => "0",
  "일" => "1",
  "이" => "2",
  "삼" => "3",
  "사" => "4",
  "오" => "5",
  "육" => "6",
  "칠" => "7",
  "팔" => "8",
  "구" => "9",
}
p str.gsub(/[공일이삼사오육칠팔구]/, numbers)  # "010-123-456-789"
p str.gsub(/[공일이삼사오육칠팔구]/) { |match| numbers[match] }  # "010-123-456-789"

gsub(pattern, replacement) -> new String

gsub(pattern) { |match| match에 따른 반환값 설정 } -> new String

방식으로 gsub를 사용하여 문자열을 치환할 수 있습니다.

 

gsub를 사용하여 문자열을 치환하면 sub와 달리 pattern에 해당하는 모든 문자열을 변경합니다.

 

 

sub! gsub! 사용 방법

# sub 사용
str1 = "-----"

p str1      # "-----"

new_str1 = str1.sub("-", "*")

p str1      # "-----"
p new_str1  # "*----"

new_str1[0] = "@"

p str1      # "-----"
p new_str1  # "@----"


# sub! 사용
str2 = "-----"

p str2      # "-----"

new_str2 = str2.sub!("-", "*")

p str2      # "*----"
p new_str2  # "*----"

new_str2[0] = "@"

p str2      # "@----"
p new_str2  # "@----"



# gsub 사용
str3 = "-----"

p str3      # "-----"

new_str3 = str3.gsub("-", "*")

p str3      # "-----"
p new_str3  # "*****"

new_str3[0] = "@"

p str3      # "-----"
p new_str3  # "@****"


# gsub! 사용
str4 = "-----"

p str4      # "-----"

new_str4 = str4.gsub!("-", "*")

p str4      # "*****"
p new_str4  # "*****"

new_str4[0] = "@"

p str4      # "@****"
p new_str4  # "@****"

예시에서 확인할 수 있듯이,

일반적으로 sub  gsub를 사용하듯이 subgsub! 를 사용할 수 있습니다.

다만 느낌표를 사용하고 사용하지 않고의 차이는,

느낌표를 사용하지 않으면 sub 혹은 gsub 메소드를 사용하는 기존의 문자열 변수는 변경하지 않고, 치환이 완료된 새로운 문자열을 반환하지만,

느낌표와 함께 사용하면 sub! 혹은 gsub! 메소드를 사용하는 기존의 문자열 자체의 값을 변경시키고 해당 문자열 자체를 얕은 복사식으로 반환합니다.

 

그래서 sub 를 사용한 예시를 보면 sub를 사용한 후 기존 문자열 str1이 변경되지 않은 것과, 반환된 문자열을 가지는 변수 new_str1의 문자열을 변경하여도 new_str1의 값만 변경되었고, str1의 값은 변경되지 않은 것을 확인하실 수 있습니다.

 

하지만 sub! 를 사용한 예시를 보면 sub!를 사용한 후 기존 문자열 str2도 변경된 값을 가지는 것과, 반환된 문자열을 가지는 변수 new_str2의 문자열을 변경하면 new_str2의 값 뿐만 아니라 str2의 값도 변경된 것을 확인하실 수 있습니다.

 

# sub! 사용
str1 = "-----"

new_str1 = str1.sub!("/", "*")

p str1      # "-----"
p new_str1  # nil


# gsub! 사용
str2 = "-----"

new_str2 = str2.gsub!("/", "*")

p str2      # "-----"
p new_str2  # nil

sub! 혹은 gsub! 를 사용할 때 만약 pattern 에 해당하는 문자열이 없다면 sub! 와 gsub! 는 nil 을 반환하게 됩니다.

 

표현을 한번 해보자면,

sub!(pattern) { |match| match에 따른 반환값 설정 } -> self OR nil

gsub!(pattern) { |match| match에 따른 반환값 설정 } -> self OR nil

위와 같이 표현해볼 수 있겠습니다!

 

 

이상으로 Ruby에서 문자열을 치환할 때 사용하는 메소드 sub / gsub / sub! / gsub! 의 사용 방법에 대한 설명을 마치도록 하겠습니다.

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청사항은 언제든지 말씀해주세요!

피드백도 언제나 환영입니다!

 

감사합니다.


댓글