我正在尝试编写一段代码,告诉用户字符串是否以特定方式格式化。格式看起来像这样(它是一个圆圈):
######\n
### ###\n
# #\n
# #\n
# #\n
# #\n
# #\n
### ###\n
######\n
\n
为了清楚起见,包括换行符; #字符可以是现有字符类中的任何字符。
我想要做的是检查字符串(来自文件)是否包含一个或多个这些“圆圈”。多个圆圈应该像这样分开:
# #\n
### ###\n
######\n
\n
######\n
### ###\n
# #\n
所以这就是我尝试过的:
isCircle = "( #{get_i}{6}\n"
isCircle += " #{get_i}{3} #{get_i}{3}\n"
isCircle += " #{get_i} #{get_i}\n"
isCircle +=("#{get_i} #{get_i}\n"*3)
isCircle += " #{get_i} #{get_i}\n"
isCircle += " #{get_i}{3} #{get_i}{3}\n"
isCircle = " #{get_i}{6}\n\n?)*"
isCircle = Regexp.new(isCircle)
(get_i是一个返回前面提到的字符类,正确转义并且所有内容的方法)
然而,当针对不正确的输入字符串进行测试时,它仍然告诉我匹配。 我做错了什么,我怎样才能正确地进行比赛?
答案 0 :(得分:1)
答案 1 :(得分:0)
这是你想要做的吗?
假设您要搜索此模式:
pattern =
%{ ######
### ###
# #
# #
# #
# #
# #
### ###
######
}
在一个文本文件中,其内容已被读入该字符串:
str =
%{###
##
######
### ###
# #
# #
# #
# #
# #
### ###
######
#######
######
######
### ###
# #
# #
# #
# #
# #
### ###
######
###
}
只需使用String#scan:
puts str.scan(pattern).join("\n")
######
### ###
# #
# #
# #
# #
# #
### ###
######
######
### ###
# #
# #
# #
# #
# #
### ###
######
如果你想要模式开始的str
的线偏移:
sarr = str.lines
parr = pattern.lines
prows = parr.size
(sarr.size-prows+1).times.select { |i| sarr[i,prows] == parr }
#==> [2, 13]