检查具有多行的字符串是否仅包含Ruby中的一组特定字符

时间:2017-05-31 18:26:02

标签: ruby regex

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

我这样做了:

string =~ /^[\ \|\_]+$/

如果字符串只有一行,例如:

,它工作正常
"|_| _| _ |_ |_| a _" =~ /^[\ \|\_]+$/ # false

但在这种情况下,它会返回true,我不想那样

"|_| _| _ |_ |_|\n 14sdfsdf" =~ /^[\ \|\_]+$/ # true?

在其他语言中,我可以添加“global”标志,但我不知道如何在Ruby中使用它。

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

3 个答案:

答案 0 :(得分:2)

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

"|_| _| _ |_ |_|\n 14sdfsdf" =~ /\A[ |_\n]+\z/
# => nil

请注意,我还在字符类中添加了\n,并删除了字符类中不必要的转义。

在Rubular上看到它:http://rubular.com/r/qR4eVaOVof或repl.it:https://repl.it/I0IR

如果你正在使用Ruby 2.4+,而不是=~,你可以使用String#match?方法(注意问号),它返回一个布尔值(并且不会填充) $~$1等全局变量,使其非常轻微效率更高):

"|_| _| _ |_ |_|\n 14sdfsdf".match?(/\A[ |_\n]+\z/)

答案 1 :(得分:0)

Ruby为Strings提供了import {Component, OnInit} from '@angular/core'; import {CommunicateService} from '../communicate.service'; @Component({ selector: 'app-child', template: `<p> child works! <button (click)="onClick()"> Click me </button> </p> ` }) export class ChildComponent { constructor(private communicateService: CommunicateService) { } onClick() { for (var i = 0; i < 10; i++) this.communicateService.sendNewString(`i is ${i}`); // string interpolation } } 方法,它允许您根据需要扫描整个String,并在此处调用regex语句。

这会在每个部分中扫描一个数组,允许您检查每个索引。

见这里:https://apidock.com/ruby/String/scan

答案 2 :(得分:0)

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

r = /[^\s_|]/

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

不需要锚点,!~返回布尔值。