如何检查Ruby中字符串中的括号或括号是否为空?
例如:
"Some text some text () some text some text" #=> Invalid string
带有空“()”或“[]”或“{}”的字符串应为false,否则为true。
示例:
"Some text some text (some text) some text some text" #=> Valid string
"Some text some text [some text] some text some text" #=> Valid string
"Some text some text {some text} some text some text" #=> Valid string
"Some text some text () some text some text" #=> Invalid string
"Some text some text [] some text some text" #=> Invalid string
"Some text some text {} some text some text" #=> Invalid string
我一直在研究使用正则表达式或scan
方法,但似乎没有一个符合我的需要。我怎么能接近呢?
答案 0 :(得分:2)
我想到的最简单的答案是检查字符串是否包含紧随其后的开头标点符号:
input =~ /\p{Ps}\p{Pe}/
不幸的是,这会抓住"[)"
和其他非配对的标点符号。在单个正则表达式(AFAIK)中,没有办法测试结束的那个是否是开头的那一对,所以下一步可能是必需的,它将检查结束一个是否是一对开一个。
为此,需要解析Names List(以及其他人)来查找开始/结束对并明确验证它们。
Bonus track:上面的解决方案也可能会有点调整以捕获正确的Unicode引号“”以及许多其他标记为配对标点符号的符号(来自@StefanPochmann)。这样现代编辑器如Atom和VSCode强调它们:< / p>
input =~ /[\p{Ps}\p{Pi}][\p{Pe}\p{Pf}]/
或(查看评论以获取详细信息):
input =~ /\p{Ps}\p{Pe}|\p{Pi}\p{Pf}/
答案 1 :(得分:2)
你可以编写自己的方法来做到这一点。
以下是一个例子:
def is_valid_string( s )
brackets = %w[ () [] {} ]
brackets.none? { |b| s.include?( b ) }
end
test_strings = [ 'hello (world)!', 'hello ()', 'test {}' ]
test_strings.each do |s|
is_valid = is_valid_string( s )
puts "#{s} -> #{ is_valid ? 'valid' : 'not valid' }!"
end
<强>输出:强>
你好(世界)! - &GT;有效!
你好() - &gt;无效!
test {} - &gt;无效!