irb(main):001:0> a="abcdefghedcba" # 題材にする文字列
=> "abcdefghedcba"
irb(main):002:0> a[0] # まずは添え字でアクセス(部分文字列)
=> "a"
irb(main):003:0> a[-1] # 負の数は末尾からの位置
=> "a"
irb(main):004:0> a[-2] # 最後から2番目の文字
=> "b"
irb(main):005:0> a[1]
=> "b"
正規表現の例題7は、正規表現を使わずに、
上の各要素を比較する(==
を使う)書き方もできる
以下は、量指定子(のうちの、*
)の使用例
irb(main):011:0> "ababababa" =~ /^(ab)*a$/
=> 0
irb(main):012:0> "ababa" =~ /^(ab)*a$/
=> 0
irb(main):013:0> "a" =~ /^(ab)*a$/
=> 0
irb(main):014:0> "ab" =~ /^(ab)*a$/
=> nil
irb(main):015:0> while gets do puts $_ end
1
1
1+2+3
1+2+3
^Z
=> nil
irb(main):016:0> s="123 + 456 * 789"
=> "123 + 456 * 789"
irb(main):017:0> s.split
=> ["123", "+", "456", "*", "789"]
irb(main):022:0> while gets do
irb(main):023:1* p $_.scan(%r!\d+|[-+/*%]!)
irb(main):024:1> end
1+2+3
["1", "+", "2", "+", "3"]
123+456*789
["123", "+", "456", "*", "789"]
^Z
=> nil
irb(main):029:0> s
=> "123 + 456 * 789"
irb(main):030:0> s.scan(//)
=> ["", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]
irb(main):032:0* s.scan(/./)
=> ["1", "2", "3", " ", "+", " ", "4", "5", "6", " " + "*", " ", "7", "8", "9"]
irb(main):034:0> s.scan(/../)
=> ["12", "3 ", "+ ", "45", "6 ", "* ", "78"]
irb(main):035:0> s.scan(/.../)
=> ["123", " + ", "456", " * ", "789"]
irb(main):036:0> s.scan(/\d/)
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
irb(main):037:0> s.scan(/0|1|2|3|4|5|6|7|8|9/)
=> ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
irb(main):038:0> s.scan(/\d*/)
=> ["123", "", "", "", "456", "", "", "", "789"]
irb(main):042:0* s.scan(/\d+/)
=> ["123", "456", "789"]
irb(main):043:0> s
=> "123 + 456 * 789"
irb(main):044:0> s.scan(/+/) # 量指定子は単独で置いても意味がない
SyntaxError: (irb):43: target of repeat opert specified: /+/
from C:/ProgramData/chocolatey/ruby2cmd:19:in `<main>'
irb(main):045:0> s.scan(/\+/) # エスケープすると量指定子でなく文字としての '+'
=> ["+"]
irb(main):046:0> s.scan(/[+]/) # 文字クラスの中に入れても同様
=> ["+"]
irb(main):047:0> s.scan(/[+*]/) # これで加算乗算の演算子にはマッチする
=> ["+", "*"]
irb(main):048:0> s.scan(/[+*]|\d+/) # 加算乗算なら使えるスキャナ
=> ["123", "+", "456", "*", "789"]
irb(main):049:0> s.scan(/[+-*]|\d+/) # `-` は(文字クラスの中では)範囲を現す記号
SyntaxError: (irb):49: empty range in char c*]|\d+/
from C:/ProgramData/chocolatey/ruby2cmd:19:in `<main>'
irb(main):050:0> s.scan(/[-+*]|\d+/) # 文字クラスの先頭や末尾に置いてその扱いを回避
=> ["123", "+", "456", "*", "789"]
irb(main):051:0> s.scan(/[+*-]|\d+/)
=> ["123", "+", "456", "*", "789"]
irb(main):052:0> s.scan(/[+*-/]|\d+/) # `/` は正規表現リテラルを囲む文字
irb(main):053:0/ /
SyntaxError: (irb):2: premature end of char-class: /[+*-/
(irb):2: syntax error, unexpected ']', expecting ')'
s.scan(/[+*-/]|\d+/)
^
(irb):3: unmatched close parenthesis: /)
/
from C:/ProgramData/chocolatey/ruby24/bin/irb.cmd:19:in `<main>'
さてどうしよう
puts と p の違い(配列を表示させたときの挙動)
irb(main):060:0> puts [1,2,3]
1
2
3
=> nil
irb(main):061:0> p [1,2,3]
[1, 2, 3]
=> [1, 2, 3]