如何编写一个检查字符串是否匹配正则表达式并返回true或false的方法?
基本思路:
def has_regex?(string)
pattern = /something/i
return string =~ pattern
end
使用案例:
if has_regex?("something")
# woohoo
else
# nothing found: panic!
end
!(string !~ /something/i)
的意思是“如果字符串中不包含 'something'(不区分大小写),则返回真”。 - ma11hew28你的代码看起来不错,但你可以将其写得更加简短。
String#=~
的返回值如下:
nil
在Ruby中,除了nil
和false
,其他所有值都在条件语句中表现为true
,所以你可以直接写成:
if string=~ pattern
# do something
else
# panic
end
Foo.new(admin: (role =~ /admin/)).admin
返回false
当role
为"admin"时,因为=〜
返回0,而Rails会将其转换为false
。只是说一下。 - codenerString#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
我绝对需要它返回true布尔值并且四处查找。 实际上这在regexp类文档中有记录 http://www.ruby-doc.org/core-2.1.3/Regexp.html#method-i-3D-3D-3D
str
不是 String
或 Symbol
时,regex === str
返回 false
,而其他在此处发布使用 =~
的解决方案会引发 TypeError
。 - cozyconemotel对于 Ruby >= 2.4 或 Rails,你可以执行以下操作:
regexp.match?(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的Ruby编码规范不建议使用双感叹号。取而代之的是,检查值不是 nil。如果该值不为nil,则存在。
不要这样做:
def has_regex?(string)
!!(string =~ /something/i)
end
def has_regex?(string)
!(string =~ /something/i).nil?
end
(string =~ /something/i).present?
,这样就不必反转它了? - rachel(string =~ /something/i) != nil
,因为我觉得它更易读。 - ma11hew28present?
是ActiveSupport方法(即Rails的一部分),如果您只使用常规Ruby,则不可用。 - GMA我没有足够的声望来评论,所以我将回答。
如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_my_pattern(st)
st =~ /pattern/
end
或者,更好的方法是将模式放在类变量中?
has_regex?
,只需执行if "something" =~ /something/i
即可。 - Jonathan Julian