使用Ruby扫描字符串

使用Ruby扫描字符串,ruby,regex,Ruby,Regex,我正在尝试创建一个正则表达式,以从如下所示的字符串中收集信息: A22xB67-E34... 对于任何数字 我有正则表达式: @spaceCode = "[A-Z]([A-Z0-9][0-9]|[0-9])" @moveCode=/^(?<one>#{@spaceCode})((?<mode>x|\-)(?<two>#{@spaceCode}))+$/ 这绝对不是我想要的 字符串可以是任意长度的C22等,使用x或-作为分隔符,并将其放入如下数组中: ['A

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

A22xB67-E34...
对于任何数字

我有正则表达式:

@spaceCode = "[A-Z]([A-Z0-9][0-9]|[0-9])"
@moveCode=/^(?<one>#{@spaceCode})((?<mode>x|\-)(?<two>#{@spaceCode}))+$/
这绝对不是我想要的

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

['A22','x',B22','-'.......]
示例:

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

大概你想单独找到这三个字母数字代码? 这个更简单的正则表达式(或其变体)会满足您的需要吗

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=])?/)

大概你想单独找到这三个字母数字代码? 这个更简单的正则表达式(或其变体)会满足您的需要吗

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=])?/)

使用类似于
split
的方法,将正则表达式设置为
([x-])


您的
regex
对于您的输入不起作用,因为这将始终覆盖组
spaceCode
mode
,即
spaceCode
mode
将只包含最后匹配的
spaceCode
mode


例如,用于输入
3664
的regex
^(\d)+$
将只捕获组中的
4
而不是
3
6
6
4

使用类似
split
的方法,regex为
([x-])


您的
regex
对于您的输入不起作用,因为这将始终覆盖组
spaceCode
mode
,即
spaceCode
mode
将只包含最后匹配的
spaceCode
mode


例如,用于输入
3664
的正则表达式
^(\d)+$
将只捕获组中的
4
而不是
3
6
6
4

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

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

考虑到字段名可以是可变长度的,这似乎应该可行:

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"]
我会这样做:

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"]
我会这样做:

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

在IRB中尝试这一点,我得到了:“RegexpError:undefined(?)sequence:/^(?[A-Z]([A-Z0-9][0-9][0-9]|[0-9]))(((?x | \-)(?[A-Z]([A-Z0-9][0-9]|[0-9]))+$/”@JohnDibling它可以通过IRB在rails上与我一起工作:S@MartinVidner我希望我能得到像
['A11',['-','A22','x','A33']这样的数组
我必须承认,我真的不知道“铁路上的irb”是什么意思:(这是意料之中的,因为你使用
命名组
,它本身包含一个
,在IRB中尝试了这一点,我得到了:“RegexpError:undefined(?)sequence:/([a-Z]([a-Z0-9][0-9]|[0-9])(([x | \-)([a-Z]([a-Z0-9][0-9])+)/”@JohnDibling通过irb on rails与我合作,效果良好:S@MartinVidner我希望我能得到一个类似于
['A11'、['-'、'A22'、'x'、'A33']]的数组。
我不得不承认,我真的不知道“irb on rails”是什么意思(这是意料之中的,因为u r使用的是本身包含一个
组的
命名组
。基本上这是一个可变的移动序列,可以是move,也可以是captre,因此它可能看起来像
AA2xA33
AA2-A33xB44
甚至
A22xC33xD44-E55
编辑的回复,以处理可变长度。)h模式。我认为这与您的示例相匹配。您应该在问题中列出一个匹配的示例列表,以使问题更清楚。让我这样做,为这里带来的麻烦感到抱歉,谢谢您。基本上,这是一个可变的移动序列,可以是move,也可以是captre,因此它可能看起来像
AA2xA33
AA2-A33xB44
或甚至
A22xC33xD44-E55
编辑回复以处理可变长度模式。我认为这与您的示例相匹配。您应该在问题中列出一个匹配的示例列表,以使其更清楚。让我这样做,对这里造成的麻烦表示抱歉,并感谢您让我们更接近,但仍然只捕获了第一个和最后一个示例regexThat使它更接近,但仍然只捕获正则表达式的第一个和最后一个