我想验证包含重复子字符串的字符串。子串具有特定的结构。整个字符串具有特定结构(子字符串由"|"
分割)。例如,字符串可以是:
1=23.00|6=22.12|12=21.34|112=20.34
1=23.00|6=22.12|12=21.34
1=23.00|12=21.34
1=23.00**
如何检查所有重复的子字符串是否与正则表达式匹配?我试着用它来检查:
"1=23.00|6=22.12|12=21.34".match(/([1-9][0-9]*[=][0-9\.]+)+/)
但即使多个子字符串与正则表达式不匹配,检查也会给出true
:
"1=23.00|6=ass|=21.34".match(/([1-9][0-9]*[=][0-9\.]+)+/)
# => #<MatchData "1=23.00" 1:"1=23.00">
答案 0 :(得分:1)
如果有重复项,则会返回true
,如果没有重复项,则返回false
:
s = "1=23.00|6=22.12|12=21.34|112=20.34|3=23.00"
arr = s.split(/\|/).map { |s| s.gsub(/\d=/, "") }
arr != arr.uniq # => true
答案 1 :(得分:1)
问题是每个重复的子字符串是否与正则表达式匹配。我知道子串由字符|
或$/
分隔,后者是一行的结尾。我们首先需要获得重复的子串:
a = str.split(/[#{$/}\|]/)
.map(&:strip)
.group_by {|s| s}
.select {|_,v| v.size > 1 }
.keys
接下来,我们指定您要使用的正则表达式。我假设是这样的:
REGEX = /[1-9][0-9]*=[1-9]+\.[0-9]+/
但如果您有其他要求,可以更改。
我们希望确定所有重复的子字符串是否与正则表达式匹配,这就是:
a.all? {|s| s =~ REGEX}
以下是计算:
str =<<_
1=23.00|6=22.12|12=21.34|112=20.34
1=23.00|6=22.12|12=21.34
1=23.00|12=21.34
1=23.00**
_
c = str.split(/[#{$/}\|]/)
#=> ["1=23.00", "6=22.12", "12=21.34", "112=20.34", "1=23.00",
# "6=22.12", "12=21.34", "1=23.00", "12=21.34", "1=23.00**"]
d = c.map(&:strip)
# same as c, possibly not needed or not wanted
e = d.group_by {|s| s}
# => {"1=23.00" =>["1=23.00", "1=23.00", "1=23.00"],
# "6=22.12" =>["6=22.12", "6=22.12"],
# "12=21.34" =>["12=21.34", "12=21.34", "12=21.34"],
# "112=20.34"=>["112=20.34"], "1=23.00**"=>["1=23.00**"]}
f = e.select {|_,v| v.size > 1 }
#=> {"1=23.00"=>["1=23.00", "1=23.00" , "1=23.00"],
# "6=22.12"=>["6=22.12", "6=22.12"],
# "12=21.34"=>["12=21.34", "12=21.34", "12=21.34"]}
a = f.keys
#=> ["1=23.00", "6=22.12", "12=21.34"]
a.all? {|s| s =~ REGEX}
#=> true
答案 2 :(得分:0)
如果你想通过regexp(而不是ruby)来解决它,你应该匹配整个字符串,而不是子字符串。好吧,我添加了[|]符号和行结尾到你的正则表达式,它应该像你想要的那样工作。
([1-9][0-9]*[=][0-9\.]+[|]*)+$
尝试一下。