Ruby 我应该怎样写一个“a”字;“聪明的”;是否将字符串与可能匹配的数组进行比较?

Ruby 我应该怎样写一个“a”字;“聪明的”;是否将字符串与可能匹配的数组进行比较?,ruby,regex,string,Ruby,Regex,String,我有一个来自输入表单的字符串,希望使用不区分大小写的比较将其与许多可能的验证字符串进行比较,如果找到匹配项,则返回true 例如,如果输入是input='florida'(或'FL',或'flor.),我将其与validate=['FL',florida']或某些类似的验证数组进行比较,它应该返回true 我知道我可以使用tagselect和一个显式的选项列表,但是,这更像是一个例子。在我的例子中,该字段可以返回多种类型的字符串,因此我试图找到一个好的“解析”解决方案。似乎Ruby擅长解决这类问

我有一个来自输入表单的字符串,希望使用不区分大小写的比较将其与许多可能的验证字符串进行比较,如果找到匹配项,则返回
true

例如,如果输入是
input='florida'
(或
'FL'
,或
'flor.
),我将其与
validate=['FL',florida']
或某些类似的验证数组进行比较,它应该返回
true


我知道我可以使用tag
select
和一个显式的选项列表,但是,这更像是一个例子。在我的例子中,该字段可以返回多种类型的字符串,因此我试图找到一个好的“解析”解决方案。似乎Ruby擅长解决这类问题?

我通常只是将值放入数组,然后使用include?方法,如果输入与数组的任何元素匹配,则返回true

['fl', 'florida', 'FL'].include?(input)

我通常只是将值放入数组,然后使用include?方法,如果输入与数组的任何元素匹配,则返回true

['fl', 'florida', 'FL'].include?(input)

比较多个字符串的最快方法是使用正则表达式,尤其是当可以对其进行更改时。Ruby提供了一些帮助器方法来简化此过程:

validate = ['fl', 'florida']

regex = /\b(?:#{ Regexp.union(validate.sort_by{ |s| [-s.size, s] }).source })\b/i
regex # => /\b(?:florida|fl)\b/i
'FL'[regex] # => "FL"
'florida'[regex] # => "florida"

'flor.'[regex] # => nil
记住,在Ruby中,只有
nil
false
是假值,其他所有结果都被认为是真的。强制设置真/假值的快捷方式是使用
)。将上述结果与以下结果进行比较:

!!'FL'[regex] # => true
!!'florida'[regex] # => true
!!'flor.'[regex] # => false
'flor.
不匹配,因为由于周围的
\b
(单词边界)标记,模式正在查找整个单词匹配。删除它们,或将
flor.
添加到模式中,可以解决以下问题:

validate = ['fl', 'florida', 'flor']
regex = /\b(?:#{ Regexp.union(validate.sort_by{ |s| [-s.size, s] }).source })\b/i
'flor.'[regex] # => "flor"
'flor.
无法使用,因为
\b
flor.
中的尾随
冲突。删除
\b

validate = ['fl', 'florida', 'flor.']
regex = /(?:#{ Regexp.union(validate.sort_by{ |s| [-s.size, s] }).source })/i
'flor.'[regex] # => "flor."
当将
validate
数组中的值传递给
Regexp.union
时,可以获得非常有表现力的值,但要注意
union
对字符串内容进行转义,以保护正则表达式中特殊的字符:

Regexp.union(%w[a \b dollars$ . * ? +]) # => /a|\\b|dollars\$|\.|\*|\?|\+/
您可以控制以下内容:

patterns = %w[a \b dollars$ . \* \? \+]
/#{ patterns.join('|') }/ # => /a|\b|dollars$|.|\*|\?|\+/
有时候我会分几个步骤构建一个模式,有时候我可以一次完成所有的工作。这是你必须尝试的东西


回到开始。联合模式之所以更快,是因为正则表达式引擎非常快,而且字符串只搜索一次,即使模式中有多个元素(使用
|
)也是如此。

比较多个字符串的最快方法是使用正则表达式,尤其是当您可以对其进行更改时。Ruby提供了一些帮助器方法来简化此过程:

validate = ['fl', 'florida']

regex = /\b(?:#{ Regexp.union(validate.sort_by{ |s| [-s.size, s] }).source })\b/i
regex # => /\b(?:florida|fl)\b/i
'FL'[regex] # => "FL"
'florida'[regex] # => "florida"

'flor.'[regex] # => nil
记住,在Ruby中,只有
nil
false
是假值,其他所有结果都被认为是真的。强制设置真/假值的快捷方式是使用
)。将上述结果与以下结果进行比较:

!!'FL'[regex] # => true
!!'florida'[regex] # => true
!!'flor.'[regex] # => false
'flor.
不匹配,因为由于周围的
\b
(单词边界)标记,模式正在查找整个单词匹配。删除它们,或将
flor.
添加到模式中,可以解决以下问题:

validate = ['fl', 'florida', 'flor']
regex = /\b(?:#{ Regexp.union(validate.sort_by{ |s| [-s.size, s] }).source })\b/i
'flor.'[regex] # => "flor"
'flor.
无法使用,因为
\b
flor.
中的尾随
冲突。删除
\b

validate = ['fl', 'florida', 'flor.']
regex = /(?:#{ Regexp.union(validate.sort_by{ |s| [-s.size, s] }).source })/i
'flor.'[regex] # => "flor."
当将
validate
数组中的值传递给
Regexp.union
时,可以获得非常有表现力的值,但要注意
union
对字符串内容进行转义,以保护正则表达式中特殊的字符:

Regexp.union(%w[a \b dollars$ . * ? +]) # => /a|\\b|dollars\$|\.|\*|\?|\+/
您可以控制以下内容:

patterns = %w[a \b dollars$ . \* \? \+]
/#{ patterns.join('|') }/ # => /a|\b|dollars$|.|\*|\?|\+/
有时候我会分几个步骤构建一个模式,有时候我可以一次完成所有的工作。这是你必须尝试的东西


回到开始。联合模式之所以更快,是因为正则表达式引擎非常快,而且字符串只搜索一次,即使模式中有多个元素是OR(使用
|
)。

该字段可以返回多种类型的字符串是什么意思?在您的示例中,
#的一些变体包括?
#any?
是否会像您希望的那样使用
验证.any?{| word | word==input}
。该字段可以返回多种类型的字符串是什么意思?在您的示例中,
#的一些变体包括?
#any?
是否会像您希望的那样使用
验证.any?{| word | word==input}
。但是要掌握正则表达式的编写--将学习和实验--谢谢!关于regex,需要学习和了解的重要一点是,它们并不适合所有场合。人们开始学习它们,认为它们对任何事情都有用,但事实并非如此。有时,当它们与定期重复的文本模式一起使用时,它们的功能非常强大,但其他时候,使用
split
scan
来分解字符串并访问其部分更容易、更快。更复杂的模式更难理解和维护。不过它们很有用。和他们玩得开心!然而,要掌握regex的写作——将学习和实验——谢谢!关于regex,需要学习和了解的重要一点是,它们并不适合所有场合。人们开始学习它们,认为它们对任何事情都有用,但事实并非如此。有时,当它们与定期重复的文本模式一起使用时,它们的功能非常强大,但其他时候,使用
split
scan
来分解字符串并访问其部分更容易、更快。更复杂的模式更难理解和维护。不过它们很有用。和他们玩得开心!很快。对于初学者,使用了:validate_array.include?(input.downcase)。谢谢很快。对于初学者,使用了:validate_array.include?(input.downcase)。谢谢