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

これは間違いなく私が望むものではありません。

x文字列は、区切り記号としてまたはを使用して、C22 などの任意の長さにすることができ-、次のような配列に入れます。

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

例:

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

4 に答える 4

2

おそらく、これら 3 つの英数字コードを個別に見つけたいと思いませんか? このより単純な正規表現 (またはその変形) は、あなたが望むことをしますか?

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

フィールド名が可変長になる可能性があることを考えると、これは機能するはずです。

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 に答える
0

split正規表現のような方法を使用します([x-])


これは常にグループandregexを上書きするため、入力に対しては機能しません。つまり、 andには最後に一致したandのみが含まれます。spaceCodemodespaceCodemodespaceCodemode

たとえば、^(\d)+$入力の正規表現は、グループ内の, ,3664のみをキャプチャします。43664

于 2012-11-09T15:59:02.140 に答える