정규 표현식(종종 regex 또는 regexp로 약칭)은 루비에서 텍스트 패턴 작업을 위한 강력한 도구입니다. 이 도구를 사용하면 특정 패턴을 기반으로 문자열을 검색하고, 일치시키고, 추출하고, 조작할 수 있습니다. 사용자 입력을 검증하거나, 데이터를 파싱하거나, 복잡한 텍스트 처리를 수행하든, 루비 정규 표현식은 간결하고 유연한 솔루션을 제공합니다.
이 튜토리얼은 기본 구문부터 고급 기술까지 루비의 정규 표현식의 기초를 안내합니다.
API 테스트 워크플로를 간소화하려는 루비 개발자는 Postman보다 여러 주요 측면에서 더 뛰어난 Apidog를 고려해야 합니다.
Apidog는 API 문서화, 디버깅, 자동화된 테스트 및 모킹을 하나의 통합 플랫폼에서 제공함으로써 Postman의 단편적인 접근 방식보다 더 통합된 경험을 제공합니다.

직관적인 인터페이스, 내장된 스키마 검증 및 포괄적인 팀 협업 기능을 갖춘 Apidog는 복잡한 API 프로젝트 관리가 훨씬 더 쉬워집니다.

루비 개발자는 Apidog의 명령줄 인터페이스를 통한 자동화의 강력한 지원, 버전 관리를 위한 원활한 Git 통합, 및 정확한 문서를 유지하는 데 필수적인 우수한 OpenAPI/Swagger 호환성을 높이 평가할 것입니다—루비 응용 프로그램과 함께 사용할 수 있습니다.

Rails로 RESTful 서비스를 구축하든 Sinatra로 마이크로서비스를 생성하든, Apidog의 올인원 툴킷은 Postman 사용자에게 발생하는 컨텍스트 전환을 없애주며, 가장 중요한 것인 훌륭한 루비 코드를 작성하는 데 집중할 수 있게 해줍니다.
루비 정규 표현식 만들기
루비에서 정규 표현식을 만드는 방법은 여러 가지가 있습니다:
방법 1: 루비 정규 표현식에서 슬래시 사용
루비에서 정규 표현식을 만드는 가장 일반적인 방법은 패턴을 슬래시(/)로 감싸는 것입니다:
/루비/ # "루비"와 일치하는 정규 표현식 생성
방법 2: 루비 정규 표현식에서 퍼센트 표기법 사용
퍼센트 표기법을 %r
표시자와 함께 사용할 수도 있습니다:
%r(루비) # /루비/와 동일합니다.
패턴에 많은 슬래시가 포함된 경우 불필요한 이스케이프를 피하는 데 특히 유용합니다.
방법 3: 루비 정규 표현식에서 Regexp 클래스 사용
또 다른 방법은 Regexp.new
생성자를 사용하는 것입니다:
Regexp.new("루비") # /루비/와 동일합니다.
이 모든 방법은 Regexp
클래스의 인스턴스를 생성합니다.
기본 루비 정규 표현식 기호
루비 정규 표현식은 다양한 패턴을 나타내기 위해 특수 기호를 사용합니다. 다음은 기본적인 기호입니다:
기호 | 설명 | 예제 | 일치하는 것 |
---|---|---|---|
. |
임의의 단일 문자와 일치 | /a.b/ |
"axb", "a2b", "a b" |
* |
이전 요소의 0회 이상 일치 | /ab*c/ |
"ac", "abc", "abbc" |
+ |
이전 요소의 1회 이상 일치 | /ab+c/ |
"abc", "abbc", "abbbc" |
? |
이전 요소의 0회 또는 1회 일치 | /ab?c/ |
"ac", "abc" |
\| |
대체 (OR) | /고양이\|개/ |
"고양이", "개" |
[] |
문자 클래스 - 나열된 문자 중 하나와 일치 | /[aeiou]/ |
"a", "e", "i", "o", "u" |
() |
캡처 그룹 생성 | /(abc)+/ |
"abc", "abcabc" |
^ |
문자열의 시작과 일치 | /^start/ |
"문자열의 시작" |
$ |
문자열의 끝과 일치 | /end$/ |
"끝" |
\\\\ |
특수 문자 이스케이프 | /\\\\\\\\/ |
"\" |
루비 정규 표현식의 특수 문자
루비 정규 표현식은 패턴 매칭을 더 쉽게 해주는 미리 정의된 문자 클래스를 포함합니다:
기호 | 설명 | 예제 | 일치하는 것 |
---|---|---|---|
\\\\d |
임의의 숫자(0-9)와 일치 | /\\\\d+/ |
"123", "9" |
\\\\D |
숫자가 아닌 문자와 일치 | /\\\\D+/ |
"abc", "!@#" |
\\\\w |
임의의 단어 문자를 일치(알파벳 + 언더바 포함) | /\\\\w+/ |
"루비123", "사용자_이름" |
\\\\W |
단어가 아닌 문자와 일치 | /\\\\W+/ |
"!@#", " " |
\\\\s |
임의의 공백 문자와 일치 | /\\\\s+/ |
" ", "\t", "\n" |
\\\\S |
임의의 비공백 문자와 일치 | /\\\\S+/ |
"안녕하세요", "123" |
\\\\A |
문자열의 시작과 일치 | /\\\\A안녕하세요/ |
"안녕하세요 세상" |
\\\\z |
문자열의 끝과 일치 | /세상\\\\z/ |
"안녕하세요 세상" |
\\\\Z |
문자열의 끝 또는 마지막 줄 전과 일치 | /세상\\\\Z/ |
"안녕하세요 세상\n" |
루비 정규 표현식의 수량사
수량사는 패턴이 몇 번 일치해야 하는지를 지정할 수 있게 해줍니다:
수량사 | 설명 | 예제 | 일치하는 것 |
---|---|---|---|
* |
0회 이상의 반복 | /ab*c/ |
"ac", "abc", "abbc" |
+ |
1회 이상의 반복 | /ab+c/ |
"abc", "abbc" |
? |
0회 또는 1회 반복 | /colou?r/ |
"color", "colour" |
{n} |
정확히 n회 반복 | /a{3}/ |
"aaa" |
{n,} |
최소 n회 반복 | /a{2,}/ |
"aa", "aaa", "aaaa" |
{n,m} |
n회에서 m회 반복 사이 | /a{2,4}/ |
"aa", "aaa", "aaaa" |
예를 들어 "123-456-7890" 형식의 전화번호와 일치시키려면 다음과 같이 사용할 수 있습니다:
/\\\\d{3}-\\\\d{3}-\\\\d{4}/
루비 정규 표현식으로 패턴 매칭하기
루비 정규 표현식에서 매치 연산자 사용
패턴이 문자열과 일치하는지 확인하는 가장 기본적인 방법은 =~
연산자를 사용하는 것입니다:
text = "빠른 갈색 여우"
if /quick/ =~ text
puts "인덱스 #{$~.begin(0)}에서 일치 발견"
else
puts "일치하는 것 없음"
end
=~
연산자는 첫 번째 일치의 인덱스를 반환하거나, 일치하는 것이 없는 경우 nil
을 반환합니다. 성공적인 일치 후, Regexp.last_match
또는 전역 변수 $~
를 사용하여 일치에 대한 정보를 액세스할 수 있습니다.
루비 정규 표현식의 캡처 그룹
괄호를 사용하여 캡처 그룹을 만들고 일치의 특정 부분을 추출할 수 있습니다:
text = "이름: 존, 나이: 30"
if match_data = /이름: (\\\\w+), 나이: (\\\\d+)/.match(text)
name = match_data[1] # 첫 번째 캡처 그룹
age = match_data[2] # 두 번째 캡처 그룹
puts "이름: #{name}, 나이: #{age}"
end
루비 정규 표현식에서 일치하는 내용 추출하기
패턴의 모든 발생를 추출하려면 scan
메서드를 사용합니다:
text = "support@example.com 또는 info@example.org로 문의하세요"
emails = text.scan(/\\\\w+@\\\\w+\\\\.\\\\w+/)
puts emails.inspect # ["support@example.com", "info@example.org"]
루비 정규 표현식 실습하기
루비 정규 표현식을 이용한 문자열 대체
gsub
메서드를 사용하면 패턴의 모든 발생을 지정한 문자열로 대체할 수 있습니다:
text = "사과 바나나 사과"
new_text = text.gsub(/사과/, "오렌지")
puts new_text # "오렌지 바나나 오렌지"
더 복잡한 대체를 위해 블록을 사용할 수도 있습니다:
text = "가격은 $10입니다"
new_text = text.gsub(/\\\\$(\\\\d+)/) do |match|
"$#{$1.to_i * 1.1}" # 10% 가격 인상
end
puts new_text # "가격은 $11입니다"
루비 정규 표현식에서 대체
파이프 기호(|
)를 사용하면 하나의 패턴 또는 다른 패턴과 일치시킬 수 있습니다:
/고양이|개/.match("나는 고양이를 가지고 있다") # "고양이"와 일치
/고양이|개/.match("나는 개를 가지고 있다") # "개"와 일치
대체를 그룹화하려면 괄호를 사용할 수 있습니다:
/(사과|바나나) 파이/.match("나는 사과 파이를 사랑한다") # "사과 파이"와 일치
루비 정규 표현식의 문자 클래스
문자 클래스는 집합에서 임의의 단일 문자와 일치시킵니다:
/[aeiou]/.match("안녕하세요") # "e"와 일치
/[0-9]/.match("agent007") # "0"와 일치
문자 클래스를 부정할 수도 있습니다:
/[^0-9]/.match("agent007") # "a"와 일치
루비 정규 표현식으로 문자열 작업하기
루비 정규 표현식에서 시작 및 끝 일치
루비는 문자열이 특정 패턴으로 시작하거나 끝나는지를 확인하는 편리한 메서드를 제공합니다:
"안녕하세요, 세상!".start_with?("안녕하세요") # true
"안녕하세요, 세상!".end_with?("세상!") # true
이러한 메서드는 정규 표현식을 기반으로 하지 않지만 문자열 조작 작업에서 종종 함께 사용됩니다.
루비 정규 표현식의 전역 변수
성공적인 일치 후, 루비는 여러 전역 변수를 설정합니다:
$&
- 전체 일치된 텍스트$`
- 일치 전의 문자열 부분$'
- 일치 후의 문자열 부분
/bb/ =~ "aabbcc"
puts $` # "aa"
puts $& # "bb"
puts $' # "cc"
루비 정규 표현식의 수정자
루비 정규 표현식은 패턴이 해석되는 방식을 변경하는 다양한 수정자를 지원합니다:
수정자 | 설명 | 예제 |
---|---|---|
i |
대소문자 구분 없이 일치 | /루비/i 는 "루비", "RUBY", "rUbY"와 일치합니다. |
m |
다중 행 모드(점이 줄 바꿈과 일치) | /./m 는 줄 바꿈을 포함한 임의의 문자와 일치합니다. |
x |
확장 모드(주석 및 공백을 허용) | /패턴 # 주석/x |
o |
#{} 보간을 한 번만 수행 | /#{패턴}/o |
u |
UTF-8 인코딩 | /\\\\u{1F600}/u 는 이모지 😀와 일치합니다. |
예시:
/루비/ =~ "RUBY" # nil (일치 없음)
/루비/i =~ "RUBY" # 0 (시작 부분에서 일치)
# 'm' 수정자가 없으면 점이 줄 바꿈과 일치하지 않음
/a.b/ =~ "a\\\\nb" # nil
# 'm' 수정자가 있으면 점이 줄 바꿈과도 일치
/a.b/m =~ "a\\\\nb" # 0
고급 루비 정규 표현식 기술
루비 정규 표현식의 비캡처 그룹
때때로 일치된 텍스트를 캡처하지 않고 그룹화해야 할 필요성이 있습니다:
/(?:ab)+c/.match("ababc") # "ababc"와 일치하지만 "ab"는 캡처하지 않음
루비 정규 표현식의 선행과 후행
선행 어설션은 다른 패턴이 뒤따를 경우에만 패턴과 일치시키는 기능입니다:
# '파이'가 뒤따를 경우에만 '사과'와 일치
/사과(?= 파이)/.match("사과 파이") # "사과"와 일치
/사과(?= 파이)/.match("사과 타르트") # 일치 없음
# '파이'가 뒤따르지 않을 경우 '사과'와 일치
/사과(?! 파이)/.match("사과 타르트") # "사과"와 일치
후행 어설션은 이와 유사하게 작동하지만 앞에 있는 것을 검사합니다:
# '사과'가 뒤따를 경우에만 '파이'와 일치
/(?<=사과 )파이/.match("사과 파이") # "파이"와 일치
/(?<=사과 )파이/.match("체리 파이") # 일치 없음
루비 정규 표현식의 성능 팁
- 특정성을 지니세요: 더 특정한 패턴이 일반적인 패턴보다 더 나은 성능을 발휘합니다.
- 과도한 백트래킹 피하기: 많은 수량사를 가진 복잡한 패턴은 성능 문제를 일으킬 수 있습니다.
- 앵커 사용하기: 적절할 경우
\\\\A
,\\\\z
,^
,$
를 사용하여 일치할 수 있는 곳을 제한하세요. - 대안 고려하기: 단순한 경우에는
include?
나start_with?
와 같은 간단한 문자열 메서드가 정규 표현식보다 더 빠를 수 있습니다.
루비 정규 표현식의 결론
루비 정규 표현식은 여러분의 프로그래밍 도구 상자에서 강력한 도구입니다. 이 도구를 사용하면 간단한 구문으로 복잡한 텍스트 처리 작업을 수행할 수 있습니다. 구문이 처음에 위협적으로 보일 수 있지만, 정규 표현식을 마스터하면 루비에서 텍스트 작업 시 생산성이 크게 향상될 것입니다.
연습은 정규 표현식에 능숙해지는 열쇠입니다. 간단한 패턴부터 시작하고 기본에 익숙해지면서 점차 더 복잡한 기능을 통합하세요. Rubular과 같은 많은 온라인 도구(https://rubular.com/)가 정규 표현식을 대화식으로 테스트하고 디버깅하는 데 도움이 될 수 있습니다.
이 튜토리얼에서 다룬 개념을 이해함으로써, 여러분은 루비 프로젝트에서 다양한 문자열 조작 문제를 해결하는 데 잘 준비될 것입니다.