2014-11-13 4 views
0

그래서 해시에서 데이터를 확인하기 위해 정규 표현식을 작성하려고합니다. YAML 파일에서 정의를 가져옵니다. 지금은 좀 지저분하지만 나중에 리팩토링 될 것입니다.YAML 파일의 정규식이 루비의 해시 값과 비교됩니다.

해시 내의 값을 확인하고 싶습니다. 입력 파일과 YAML 파일을 구문 분석 할 수 있습니다.

는 여기 함수의 일부, 여기 내 YAML

:pmt_sum: 
- Type: NUMBER 
- Expected: !ruby/regexp '/\d*/' 

의 점검을 수행해야하는데 코드의 그 해시를 반복 (header_def은 해시) :

header_def.each { |key, value| 
    if parsed_hash[0][key] != value[2]["Expected"] 
    puts "#{key} value does not match #{value[1]["Expected"]}, it returned #{parsed_hash[0][key]" 
    else 
    puts "working as intended" 
    end 
} 

hash[0][key] 입력 파일에서 :pmt_sum 키를 꺼내고 YAML에있는 내용과 일치하지 않으면 메시지를 출력합니다. 이것은 내가 정규식을 사용하려고하지만 경우에,이 뱉어, 나는 하드 코드 아무것도 작동합니다

pmt_sum value does not match (?-mix:\d*), it returned 7 

사람이 YAML 파일에서 루비 프로그램에 정규식 전달에 대한 도움말이 있습니까?

편집 : 무시, 값의 클래스 [2] [ "Expected"]를 확인하기 위해 case 문을 사용하여 수정하고 Regexp 일 때 .match를 사용했습니다. 그래도 도와 ​​줘서 고마워!

+0

Ruby 정규식을 YAML 파일에 저장하는 대신 문자열로 저장 한 다음 YAML을 읽은 후 변환하려면'/ # {string} /'또는'Regexp.new (string)'을 사용하십시오 . 이를 통해 YAML은 다른 언어로 이식 할 수 있습니다. –

+0

'header_def'가 없으면 어디에 문제가 있는지 알기가 어렵습니다. 그것의 최소 버전을 제공하십시오. –

답변

0

나는 예상 클래스는 정규 표현식 있는지 확인하는 case 문을 사용하여 상처 (가독성을 위해 변수로 물건을 버려.)

감사 어쨌든!

-1

나는 다르게 할 몇 가지가 있습니다. 그것뿐만 아니라 일 것 같은

require 'yaml' 

obj = YAML.load(<<EOT) 
:pmt_sum: 
- Type: NUMBER 
- Expected: !ruby/regexp '/\d*/' 
EOT 

obj # => {:pmt_sum=>[{"Type"=>"NUMBER"}, {"Expected"=>/\d*/}]} 

는 대신에, 당신은 아마 정말 해시를 원하는 :

YAML은 정상이 단일 요소 해시의 배열을 생성하는 것입니다. 다음은 빠른 빌드 방법입니다.

require 'yaml' 

hash = { 
    "Type" => "NUMBER", 
    "Expected" => /\d*/ 
} 

File.write('foo.yaml', hash.to_yaml) 

저장하고 실행하면 "foo.yaml"이 출력됩니다. 해당 파일을 살펴보면하면 YAML이로 보여줍니다 :이 시점에서

require 'yaml' 
hash = YAML.load_file('foo.yaml') 
hash # => {"Type"=>"NUMBER", "Expected"=>/\d*/} 

의 YAML이 제대로 왕복을하고있다 :

--- 
Type: NUMBER 
Expected: !ruby/regexp /\d*/ 

사용하고 있음을 다시로드. 당신이 정말 당신의 구조를 원한다면, 먼저 루비 구축 디스크로 방출, 그 작업 :

--- 
:pmt_sum: 
- Type: NUMBER 
- Expected: !ruby/regexp /\d*/ 
: 실행할 때와 같은 'foo.yaml'를 만들어

require 'yaml' 
hash = {:pmt_sum=>[{"Type"=>"NUMBER"}, {"Expected"=>/\d*/}]} 
File.write('foo.yaml', hash.to_yaml) 

그러나 왜 데이터를 단순화하는 것이 더 나은지 다시 생각해보십시오. YAML에 정규식을 저장하는 방법에 대한

hash = { 
    "Type" => "NUMBER", 
    "Expected" => /\d*/ 
} 
hash['Expected'] # => /\d*/ 

:

hash = { 
    :pmt_sum => [ 
    {"Type" => "NUMBER"}, 
    {"Expected" => /\d*/} 
    ] 
} 

hash[:pmt_sum][1]['Expected'] # => /\d*/ 

대 : 그것은 간단한 해시 항목에 액세스 할 쉽게 당신이 그것을 고정하고, 그래서 YAML은 언어 사이의 이식이 가능하도록되어 어떠한 큰 이점도 얻지 못한 채 Ruby에 통합되었습니다.같은

Expected: !ruby/regexp '/\d*/' 

사용 무언가 :

Expected: '\d*' 

문자열 발생합니다 다음 YAML 파일에

Expected: "\\d*" 

를 대신 같은 패턴을 정의.

/#{ hash['Expected'] }/ # => /\d*/ 

또는

Regexp.new(hash['Expected']) # => /\d*/ 

: YAML 문자열로 다시 돌아갑니다으로, 그래서 이들 중 하나처럼 뭔가를 사용하기 전에 어떤 점에서 정규식으로 변환하는 것이 구문 분석

결과 YAML은 모든 언어에서 필요에 따라 사용되며 필요한 기능을 사용할 수 있습니다.

관련 문제