在 ruby 中,我如何针对一组混合数据类型测试输入字符串?
In ruby, how can I test input strings against a set of mixed data types?
我正在尝试根据必填字段和可选字段的简短列表在 ruby 中编写一个基本的 MARC 验证程序,部分是作为在 ruby 中编写内容的练习,我不是很熟悉。
我想出了看起来有效的 ruby 代码来存储我的 "optional" 字段(并且脚本在启用代码时执行):
Optional = ['006', '007', '010', '020', '022', {'040' => ['c']}, '041', ['050', '060', '082', '086', /09\d/], {/1\d\d/ => ['a']}, {'240' => ['a']}, '250', {'260' => ['a', 'b', 'c']}, {'300' => ['a']}, '490', /7[0-5]\d/, '830']
根据我有限的阅读,这在技术上是可行的...但我不确定从这里该何去何从。我想遍历记录中的各个字段,如果缺少一个字段(或子字段,如果有的话),在屏幕上写一个警告:
sysnum = record['001']
record.fields.each do |field|
Optional.each do |optfield|
if field.tag =~ optfield
break
else
puts "#{sysnum} is missing #{field.tag}"
end
end
end
但是,这并不适用于我的所有情况,因为并非所有 optfield
值都是字符串。我应该使用 if 块来测试哈希值吗?正则表达式值呢?当右侧不是正则表达式(string =~ otherstring
而不是 string =~ regex
)时,=~
会测试为真吗?
我是不是找错人了?
您可能想使用 ===
,您可以读作 "kinda equals"。如您所料,它适用于字符串和正则表达式:
'100' === '100'
# true
/1\d\d/ === '100'
# true
对于您的数组,您可以使用 Regexp.union
将字符串数组转换为匹配任何这些字符串的正则表达式。
我正在尝试根据必填字段和可选字段的简短列表在 ruby 中编写一个基本的 MARC 验证程序,部分是作为在 ruby 中编写内容的练习,我不是很熟悉。
我想出了看起来有效的 ruby 代码来存储我的 "optional" 字段(并且脚本在启用代码时执行):
Optional = ['006', '007', '010', '020', '022', {'040' => ['c']}, '041', ['050', '060', '082', '086', /09\d/], {/1\d\d/ => ['a']}, {'240' => ['a']}, '250', {'260' => ['a', 'b', 'c']}, {'300' => ['a']}, '490', /7[0-5]\d/, '830']
根据我有限的阅读,这在技术上是可行的...但我不确定从这里该何去何从。我想遍历记录中的各个字段,如果缺少一个字段(或子字段,如果有的话),在屏幕上写一个警告:
sysnum = record['001']
record.fields.each do |field|
Optional.each do |optfield|
if field.tag =~ optfield
break
else
puts "#{sysnum} is missing #{field.tag}"
end
end
end
但是,这并不适用于我的所有情况,因为并非所有 optfield
值都是字符串。我应该使用 if 块来测试哈希值吗?正则表达式值呢?当右侧不是正则表达式(string =~ otherstring
而不是 string =~ regex
)时,=~
会测试为真吗?
我是不是找错人了?
您可能想使用 ===
,您可以读作 "kinda equals"。如您所料,它适用于字符串和正则表达式:
'100' === '100'
# true
/1\d\d/ === '100'
# true
对于您的数组,您可以使用 Regexp.union
将字符串数组转换为匹配任何这些字符串的正则表达式。