정규식을 사용하여 Ruby에서 간단한 영어 문장으로 정규식 읽기 및 쓰기

5798 단어 rubyshowdevbeginners
우리 모두는 소프트웨어 개발 과정에서 때때로 정규식을 접하게 됩니다. 정규식으로 수행하는 일반적인 작업 중 일부는 공통 패턴이 있는 특정 문자열 또는 하위 문자열 집합을 찾고 사용자 입력에 대한 자체 사용자 지정 유효성 검사를 수행하려는 것입니다.

그러나 우리는 정규식을 우연히 발견했습니다. 아마도 눈을 크게 뜨고 읽고 이해하려고 노력하는 동안 머리를 긁적일 것입니다. 글쎄, 적어도 그것은 내가 항상하는 일이며 정규식에 대한 경험이 많지 않은 사람들에게 가장 가능성이 높습니다.

정규식을 읽기 때문에 다른 행성의 언어처럼 느껴집니다. 그것은 문자와 숫자의 혼합으로 가득 차 있으며 사방에 뒤죽박죽입니다. 예를 들면 다음과 같습니다.

/-?\d+(\.\d*)?/


위의 정규식은 양수 또는 음수 십진수를 일치시키기 위한 것입니다. 정규식 초보자에게 이것은 실제로 지구에서 온 것이 아닌 것처럼 보입니다. 초보자가 이 세상 언어를 해독하고 자신만의 언어를 만드는 데는 시간이 걸립니다.

그래서 조금 더 이해하기 쉽고 쉽게 만들 수 있도록 간단한 영어 단어와 문장으로 정규식을 쉽게 읽고 쓸 수 있는 regexer라는 루비 DSL을 만들었습니다. 구문 측면에서는 Factorybot 및 RSpec에서 영감을 받았습니다.

시작하기



시작하려면 regexer gem을 설치하십시오.

gem install regexer


PatternBuilder 클래스의 인스턴스에 대한 DSL 메소드 호출을 포함하는 블록을 제공하여 정규식 패턴을 빌드합니다.

우선 다음과 같이 알파벳의 모든 소문자와 일치하는 정규식 패턴을 만들 수 있습니다.

Regexer::PatternBuilder.new do
  has_letter from: "a", to: "z"
end

# generates /[a-z]/


또는 'hello'라는 단어의 연속 인스턴스와 일치하는 정규식 패턴을 만들 수 있습니다.

Regexer::PatternBuilder.new do
  has_consecutive_instances_of 'hello'
end

# generates /(hello)+/


위의 예는 사용 가능한 DSL 방법 중 하나를 간단히 사용한 것입니다. 약간 더 복잡한 정규식 패턴을 만들기 위해 실제로 DSL 메서드를 연결하고 간단한 문장으로 표현할 수 있습니다. 예를 들면 다음과 같습니다.

Regexer::PatternBuilder.new do
  starts_with consecutive_instances_of letter from: "A", to: "Z"
end

# generates /^([A-Z]+)/


보시다시피 실제로는 간단한 문장으로 읽힙니다.

생성된 정규식 패턴을 확인하기 위해 #result 메서드를 호출하여 Regexer::Model::Pattern 인스턴스를 반환하고 #regex 메서드를 호출하여 정규식 값을 얻을 수 있습니다.

pattern = Regexer::PatternBuilder.new do
  starts_with consecutive_instances_of letter from: "A", to: "Z"
end.result

puts pattern.regex
# Outputs /^([A-Z]+)/


보시다시피 regexer에서 regex '/^([A-Z]+)/'를 생성하기 위해 이해하기 쉽고 regex에서 원하는 것과 거의 유사한 기능을 하는 문장을 만들었습니다.

이제 서론에서 언급한 정규식 패턴과 같은 외계인으로 돌아가서 실제로 정규식에서 그 패턴을 다음과 같이 표현할 수 있습니다.

pattern = Regexer::PatternBuilder.new do
  has_none_or_one_instance_of "-"
  has_consecutive_instances_of digit_character
  has_none_or_one_instance_of group {
    contains "."
    has_none_or_consecutive_instances_of digit_character
  } 
end.result

puts pattern.regex
# Outputs /\-?\d+(\.\d*)?/


따라서 이 정규식 '/-?\d+(.\d*)?/'와 위의 정규식을 해석한 정규식을 비교하면 정규식은 더 인간 친화적인 느낌을 줍니다. 원시 정규식 패턴과 정확히 일치하지는 않았지만 기술적으로 정규식에 의해 생성된 정규식 패턴은 원시 정규식과 동일하게 작동합니다.

폐쇄



이것은 내 첫 번째 루비 보석이며 내 자신의 DSL hehe를 만드는 것은 처음입니다. 비슷한 보석을 가지고 있고 더 복잡한 패턴을 구축하고 여전히 사람이 읽을 수 있도록 노력하는 다른 사람들이 있지만. 그럼에도 불구하고 이렇게 출시하게 되어 기쁘고 루비로 DSL을 만드는 재미가 쏠쏠합니다 ㅎㅎㅎㅎ

지금까지 regexer의 현재 상태는 단순하거나 약간 더 복잡한 regex 패턴이 보다 읽기 쉬운 형식으로 생성되도록 허용합니다. 하지만 머지않아 더 복잡한 정규식 패턴을 구축하면서도 간단한 영어 문장 구조를 유지할 수 있도록 더 많은 기능을 추가할 예정입니다.

이 Ruby DSL이 특히 초보자를 위해 적어도 정규식을 더 쉽게 읽고 이해할 수 있기를 바랍니다.

여기에서 보석 저장소를 확인할 수 있습니다: https://github.com/IvanIlagan/regexer-ruby

repo의 gem을 사용하여 빌드할 수 있는 가능한 정규식 패턴의 더 많은 예가 있습니다. 또한 더 많은 정보를 탐색할 수 있습니다.
사용 가능한 DSL 방법을 사용하여 필요에 따라 더 많은 문장을 정규식으로 혼합하고 일치시킬 수 있습니다. 즐거운 코딩하세요!

좋은 웹페이지 즐겨찾기