我正在尝试编写一段代码,告诉用户字符串是否以特定方式格式化。格式如下所示(它是一个圆圈):
######\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是一个返回前面提到的字符类、正确转义和所有内容的方法)
然而,当对一个不正确的输入字符串进行测试时,它仍然告诉我有一个匹配。我做错了什么?我如何才能正确地执行比赛?
发布于 2014-09-08 03:24:06
也许是这样的:
[ ]+#{6}[\n ]+#{3}[ ]+#{3}[\n ]+(?>#[ ]+#[\n\s]+)+#{3}[ ]+#{3}[\n\s]+#{6}\s*Demo
发布于 2014-09-08 04:45:22
这就是你想做的吗?
假设您希望搜索以下模式:
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]https://stackoverflow.com/questions/25713670
复制相似问题