実演例

正規表現の理解のために

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