检查字符串是否存在模式并在正则表达式匹配时返回 true 或 false 的方法的正确语法是什么?
基本理念:
def has_regex?(string)
pattern = /something/i
return string =~ pattern
end
使用案例:
if has_regex?("something")
# woohoo
else
# nothing found: panic!
end
您在问题中说:
...检查字符串是否有模式的方法,如果正则表达式匹配则返回 true 或 false
正如 johannes 指出的那样,如果模式不匹配,则
String=~
返回 nil
,否则返回字符串中匹配单词所注视的位置。此外,他在 Ruby 中陈述了除了 nil
和 false
behave like true
之外的所有内容。这一切都是对的。
但是,它们并不完全
true
或false
。因此,最后一步是将值强制为 Boolean
。这是通过将结果包装在双刘海中返回 true
来实现的。
def has_regex?(string)
!!(string =~ /something/i)
end
你的代码看起来不错,但你可以把它写得更小。
String#=~
的返回值的行为如下:
nil
如果模式不匹配在 Ruby 中,除了
nil
和 false
之外的所有内容都像条件语句中的 true
一样,所以你可以直接写
if string=~ pattern
# do something
else
# panic
end
如果您使用的是 Ruby 2.4 或更高版本,有
String#match?(regex)
和 Regexp#match?(string)
方法可以返回布尔值而无需进行转换(需要它们,但通常不需要),并且提高了启动性能。
https://ruby-doc.org/core-2.4.0/Regexp.html#method-i-match-3F
要使其返回 true/false,请切换模式和字符串的位置并使用用例相等 ===
def has_regex?(string)
pattern = /something/i
return pattern === string
end
我绝对需要它返回真正的布尔值并进行挖掘。 它实际上记录在 regexp 类中http://www.ruby-doc.org/core-2.1.3/Regexp.html#method-i-3D-3D-3D
对于 Ruby >= 2.4 或 Rails,你可以这样做:
regexp.match?(string)
将其添加到 String 类使其使用起来非常简单:
class String
def match?(regex)
!!self.match(regex)
end
end
我将其添加到 Rails 初始化程序 (RAILS_ROOT/config/initializers) 中,您可以直接从字符串调用:
"Something special!".match?(/something/i) #=> true
"Somethin' special!".match?(/something/i) #=> false
供任何人未来参考,bbatsov 的红宝石风格指南中双刘海是不受欢迎的。不要使用双声,只需检查值是否为 nil 即可。 如果该值不为零,则它存在。
而不是这样做:
def has_regex?(string)
!!(string =~ /something/i)
end
您始终可以这样做:
def has_regex?(string)
!(string =~ /something/i).nil?
end
我没有足够的声誉来发表评论,所以我会回答。
按照viljar的建议,在Ruby风格指南中建议不要使用===,这会导致Rubocop投诉(在默认规则下)。
我发现最易读的方式是:
def match?(string)
!(string =~ /something/i).nil?
end
由于我希望它能够普遍工作,而不仅仅是针对任何特定项目,因此我根本不想修改环境。
我只需使用正常
match
方法的返回值作为条件就可以让它工作。 在此示例字符串上测试了正向和负向情况:
irb(main):014:0> if "123".match(/.2./); puts "worked"; end
worked
=> nil
irb(main):015:0> if "123".match(/.3./); puts "worked"; end
=> nil
def has_regex?(string)
string.include? pattern
end
如果你想将模式放入方法中,你可以这样做
def has_my_pattern(st)
st =~ /pattern/
end
或者,也许更好,将模式放入类变量中?