我正在尝试验证可能包含多行的字符串只包含下一个字符: 空格,下划线或管道(“”,“_”“|”)
我这样做了:
string =~ /^[\ \|\_]+$/
如果字符串只有一行,例如:
,它工作正常"|_| _| _ |_ |_| a _" =~ /^[\ \|\_]+$/ # false
但在这种情况下,它会返回true,我不想那样
"|_| _| _ |_ |_|\n 14sdfsdf" =~ /^[\ \|\_]+$/ # true?
在其他语言中,我可以添加“global”标志,但我不知道如何在Ruby中使用它。
我需要它来返回一个布尔值。
答案 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语句。
这会在每个部分中扫描一个数组,允许您检查每个索引。
答案 2 :(得分:0)
在这种情况下,更容易检查字符串是否包含给定字符以外的字符:
r = /[^\s_|]/
"|_| _| _ |_ |_|\n _" !~ r #=> true
"|_| _| _ |_ |_|\n 14sdfsdf" !~ /[^\s_|]/ #=> false
不需要锚点,!~
返回布尔值。