0

我正在尝试创建一个正则表达式来从如下所示的字符串中收集信息:

A22xB67-E34...

对于任何数字。

我有正则表达式:

@spaceCode = "[A-Z]([A-Z0-9][0-9]|[0-9])"
@moveCode=/^(?<one>#{@spaceCode})((?<mode>x|\-)(?<two>#{@spaceCode}))+$/

但是我得到:

s="A11-A22xA33".scan(@moveCode)
=> [["A11", "11", "xA33", "x", "A33", "33"]]

这绝对不是我想要的。

该字符串可以是任何长度的 C22 等,使用x-作为分隔符,并将其放入如下数组中:

['A22','x',B22','-'.......]

例子:

"A22xB23-D23xE25" => ['A22','x','B23','=','D23','E25;]
"AA2xA9-A1" => ['AA2','x','A9','-','A1']
4

4 回答 4

2

想必你想孤立地找到这三个字母数字代码?这个更简单的正则表达式(或它的变体)会做你想要的吗?

def decode string
  puts "\nDecoding #{string}"
  code = "[A-Z0-9]{1,3}"
  sep = "[-x=]"
  r = /(?:(#{code})#{sep}?)?/
  string.scan(r)
end

puts decode("A22xA33")
puts decode("A11-A22xA33")
puts decode("A22xB67-E34")
puts decode("A22xC33xD44-E55")
puts decode("A22xB23-D23=E25")

或者如果您也想捕获动作/分隔符,例如:

r = /(?:#{code}#{sep}?)?/

或将数组中的动作/分隔符捕获为代码之间的单独项目:

r = /(#{code})?(#{sep})?/

所以我认为你想要的是:

def decode string
  puts "\nDecoding #{string}"
  code = "[A-Z0-9]{1,3}"
  sep = "[-x=]"
  r = /(#{code})?(#{sep})?/
  string.scan(r)
end

或者以最简单的形式:

string.scan(/([A-Z0-9]{1,3})?([-x=])?/)
于 2012-11-09T15:56:23.623 回答
1

我会这样做:

MOVE_REGEX = /[a-z]+\d+/i
REGEX = /(#{ MOVE_REGEX })([x-]?)/i

class String
  def parse_move
    self.scan(REGEX).flatten.reject(&:empty?)
  end
end

"A22xB23-D23xE25".parse_move
# => ["A22", "x", "B23", "-", "D23", "x", "E25"]

"AA2xA9-A1".parse_move
# => ["AA2", "x", "A9", "-", "A1"]
于 2012-11-11T05:20:13.170 回答
0

使用像split正则表达式一样的方法([x-])


regex不会为您的输入工作,因为这将始终覆盖组spaceCodeand mode,即spaceCodeandmode将仅包含最后匹配的spaceCodeand mode

例如,^(\d)+$输入的正则表达式3664将仅捕获组中的4not 3, 6, 6, 4

于 2012-11-09T15:59:02.140 回答
0

鉴于字段名称可以是可变长度,这似乎应该可行:

def parse_moves(s)    
  s.scan(/([A-Z0-9]+)?([-x])?/).flatten.compact
end

您的示例的结果:

1.9.3-p125 :027 > moves = ["A11-A22xA33", "A22xB23-D23xE25", "AA2xA9-A1"]
 => ["A11-A22xA33", "A22xB23-D23xE25", "AA2xA9-A1"] 
1.9.3-p125 :028 > moves.each { |s| puts parse_moves(s).to_s }
["A11", "-", "A22", "x", "A33"]
["A22", "x", "B23", "-", "D23", "x", "E25"]
["AA2", "x", "A9", "-", "A1"]
于 2012-11-09T16:38:38.647 回答