!~をmatch?に変える

最近!~とか正規表現関連のことばっかりの記述をしている気がする

 

とりあえずやらないといけないことは

aa !~ /^abc/

の形をmacth?メソッドを使って書き直さなければならない

puts aa.match?(/^[^abc]/)

こういう風に書いてみた

$ ruby practice.rb

false

false

うまくいったっぽい

 

続いて

aa = "abc3333"
bb = "333abc33333"
cc = "annnbnnncnn"
dd = "vbckkkk"

puts aa !~ /^abc/
puts aa.match?(/^[^abc]/)
puts bb !~ /^abc/
puts bb.match?(/^[^abc]/)
puts cc !~ /^abc/
puts cc.match?(/^[^abc]/)
puts dd !~ /^abc/
puts dd.match?(/^[^abc]/)

こんだけ試してみた

$ ruby practice.rb

false

false

true

true

true

false

true

true

 

あれ!?

ccだけ違う結果になった

どうやら

puts cc !~ /^abc/

の書き方はaが最初にあってbcがあれば通るようだ

puts cc.match?(/^[^abc]/)

こっちの方が良いコードっぽい

ruby 正規表現 否定

以前

https://tetsu-1999.hatenablog.com/entry/2019/10/22/190237

この記事で正規表現の否定についての記事を書いたが、どうやらトンチンカンなことを書いていたようです。

 

https://www.javadrive.jp/rubyregexp/character/index3.html

この記事に書いてあるように正規表現の否定をしたかったら[^aaa]のような記述をすれば良いらしい

 

試してみた

aa = "abc3333"
bb = "a333abc33333"

puts aa =~ /abc/
puts aa =~ /^[^abc]/

こんなコードを書いてみた

ruby practice.rb

0

 

 

こんな感じの実行結果になった。いけたかな

 

 

%w()と%W()とは

%w()はrubyスッキリしたコードで文字列の配列が作成するための記法です。

https://www.sejuku.net/blog/46939#w

 

では%w()と%W()で具体的に何が違うのかというと

 

%W()は()内で式展開することができます。

 

では具体的にどういうことかというと

こうコードを打つと

aa = ["hello","","bye"]
bb = %w(hello #{} bye)
cc = %W(hello #{} bye)

puts aa
puts bb
puts cc

このように出力されます

$ ruby practice.rb

hello

 

bye

hello

#{}

bye

hello

 

bye

 

bbはと#{} 出力されたのに対してccは空欄になりました。

このように%W記法は()内で式展開することが可能になります。

%w()と%W()とは

%w()はrubyスッキリしたコードで文字列の配列が作成するための記法です。

https://www.sejuku.net/blog/46939#w

 

では%w()と%W()で具体的に何が違うのかというと

 

%W()は()内で式展開することができます。

 

では具体的にどういうことかというと

こうコードを打つと

aa = ["hello","","bye"]
bb = %w(hello #{} bye)
cc = %W(hello #{} bye)

puts aa
puts bb
puts cc

このように出力されます

$ ruby practice.rb

hello

 

bye

hello

#{}

bye

hello

 

bye

 

bbはと#{} 出力されたのに対してccは空欄になりました。

このように%W記法は()内で式展開することが可能になります。

Rubyでの正規表現の否定

正規表現の否定をしたいと思い調べてみたところ

http://www-creators.com/archives/1827

このサイトがすぐにぶち当たった。

(?!PATTERN)

を使うことによってPATTERNを含まないという意味を持つ正規表現が作れるらしい。

 

実際に試してみた

aa = "abc333333"
bb = "333abc333333"


puts aa.match?(/abc/)

puts aa.match?(/(?!abc)/)

このコードを書いて実行してみた

$ ruby practice.rb

true

true

 

んんっ!?

全く否定の意味を持っていない

 

結果として

aa = "abc333333"
bb = "333abc333333"


puts aa.match?(/abc/)

puts aa.match?(/^(?!abc)/)

このコードを打つと

$ ruby practice.rb

true

false

 

うまくいった!!

よくわからないがおそらく(?! PATTERN)はPATTERNを一つの塊としてみることくらいの意味しかないのではないかと思う。

 

ちょっとまだよくわからないなあ、完璧に理解してる人がいればコメント欲しいです

 

aa ? aa : nil と aa||nil の違い

rubocopでaa ? aa : nilのところを || に直せと言われた

どう一緒になるのか試してみた

 

書いたコード

aa = "aa"
bb = ""
cc = nil
dd = false

puts aa.nil?

puts bb.nil?

puts cc.nil?

puts dd.nil?

puts aa ? aa : nil

puts bb ? bb : nil

puts cc ? cc : nil

puts dd ? dd : nil

puts aa||nil

puts bb||nil

puts cc||nil

puts dd||nil

if aa||nil
  puts "hello"
else
  puts "bye"
end

if bb||nil
  puts "hello"
else
  puts "bye"
end

if cc||nil
  puts "hello"
else
  puts "bye"
end

if dd||nil
  puts "hello"
else
  puts "bye"
end

if bb == cc
  puts "hello"
else
  puts "bye"
end

if bb == dd
  puts "hello"
else
  puts "bye"
end

if dd == cc
  puts "hello"
else
  puts "bye"
end

出力結果

$ ruby practice.rb

false

false

true

false

aa

 

 

 

aa

 

 

 

hello

hello

bye

bye

bye

bye

bye

 

 

こうなった。

どうやらおんなじっぽい