在Ruby中检查多行字符串是否只包含一组特定字符

在Ruby中检查多行字符串是否只包含一组特定字符,ruby,regex,Ruby,Regex,我正在尝试验证可能包含多行的字符串是否只包含下一个字符: 空格、下划线或管道(“,”124;“)) 我这样做: string =~ /^[\ \|\_]+$/ 如果字符串只有一行,它就可以正常工作,例如: "|_| _| _ |_ |_| a _" =~ /^[\ \|\_]+$/ # false 但在这种情况下,它将返回真值,我不希望这样 "|_| _| _ |_ |_|\n 14sdfsdf" =~ /^[\ \|\_]+$/ # true? 在其他语言中,我可以添加“global”标

我正在尝试验证可能包含多行的字符串是否只包含下一个字符: 空格、下划线或管道(“,”124;“))

我这样做:

string =~ /^[\ \|\_]+$/
如果字符串只有一行,它就可以正常工作,例如:

"|_| _| _ |_ |_| a _" =~ /^[\ \|\_]+$/ # false
但在这种情况下,它将返回真值,我不希望这样

"|_| _| _ |_ |_|\n 14sdfsdf" =~ /^[\ \|\_]+$/ # true?
在其他语言中,我可以添加“global”标志,但我不知道如何在Ruby中添加


我需要它返回一个布尔值。

Ruby具有字符串的
.scan
方法,允许您根据需要扫描整个字符串,并在此基础上调用regex语句

这会将每个部分扫描到一个数组,允许您检查每个索引


请参见此处:

分别使用
\A
\z
锚来匹配字符串的开头和结尾:

"|_| _| _ |_ |_|\n 14sdfsdf" =~ /\A[ |_\n]+\z/
# => nil
注意,我还向character类添加了
\n
,并删除了character类中不需要的转义符

请参见Rubular:或repl.it:

如果您使用的是Ruby 2.4+,而不是
=~
,则可以使用该方法(请注意问号),该方法返回一个布尔值(并且不填充
$~
$1
等全局值,使其效率略微提高):


在这种情况下,更容易检查字符串是否包含给定字符以外的字符:

r = /[^\s_|]/

"|_| _| _ |_ |_|\n _" !~ r                #=> true
"|_| _| _ |_ |_|\n 14sdfsdf" !~ /[^\s_|]/ #=> false

不需要锚固件,
~返回布尔值。

嗨,谢谢你的帮助,但我忘了说我需要它来返回布尔值谢谢,它工作了!我刚刚添加了
!!()
并返回布尔值too@SamuelE. 我不确定您是否看到了我的编辑,但是
m
标志毕竟是不必要的。此外,如果您使用的是Ruby 2.4+,而不是
=~
,则可以使用该方法,该方法返回布尔值(并且由于链接文档中提到的原因,该方法的效率也稍高)。
nil
是布尔值?@CarySwoveland否,不是。也许您正在考虑
String#match
。我的意思是OP要求它返回布尔值(
true
false
),但您返回
nil
。也许是OP在你回答后做了编辑。为什么要急着选择答案呢?
r = /[^\s_|]/

"|_| _| _ |_ |_|\n _" !~ r                #=> true
"|_| _| _ |_ |_|\n 14sdfsdf" !~ /[^\s_|]/ #=> false