2014-02-14 63 views
-1

我想验证一个包含重复的子串的字符串。子串具有特定的结构。整个字符串具有特定的结构(由"|"分割的子字符串)。例如,字符串可以是:正则表达式来匹配重复的子串

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"> 

回答

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 
0

,你应该匹配整个字符串,而不是子字符串。那么,我添加了[|]符号和行结尾到您的正则表达式,它应该像你想要的。

([1-9][0-9]*[=][0-9\.]+[|]*)+$ 

试一试。

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 
+0

这个返回TRUE为'S =“21 = 23.00 | 22 = 23.00“'和's =”6 ='猫'| 6 ='猫'“'。 –