正则表达式匹配重复的子串

时间:2014-02-14 07:37:54

标签: ruby regex

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

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

3 个答案:

答案 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\.]+[|]*)+$

尝试一下。