第6回コベチケの会

コベリンの最近の取り組みとして、業務などで役立ちそうな知見を共有する会を開催することになりました。 そのついでに発表に使ったアジェンダもそのまま公開してしまおうという豪快な企画です。

※ アジェンダをそのままコピペして公開したものなので若干見にくい箇所もあるかもしれませんが、ご了承ください。

正規表現! /(肯定|否定)(先|後)読み/ @mironal

  • 正規表現にこんな機能があるよというお話
  • 難しくて覚えてられないので実際に使うときはググろう

js の正規表現基礎

全然知らない人のための説明.

// / で囲むと正規表現リテラル
var regex = /pattern/

// new RegExp でも作れる
var regex2 = new RegExp("pattern")

// replace で正規表現を使った文字の置き換えができる
"AbCd".replace(/[A-Z]/g,"") // 大文字だけ置き換える(g は何度も適用するオプション
// "bd"

// g がないとこうなる
"AbCd".replace(/[A-Z]/,"")
// "bCd"


// パターンを () で囲むとパターンにマッチした文字列をキャプチャできる.
// 更にその結果を $N を使って後から参照できる.
// 名前と苗字を入れ替える例
"yamada tarou".replace(/(\w+)\s(\w+)/, "$2 $1")
"tarou yamada"

ワインの解析しててぶち当たった壁

ワインのぶどう品種に表記のゆらぎがあったので統一したかった、例えばソーヴィニヨン・ブランという品種があるが、これが銘柄やお店によって

  • ソーヴィニヨン
  • ソーヴィニヨン・ブラン
  • ソーヴィニョン・ブラン
  • ソーヴィニヨンブラン
  • ソービニオンブラン
  • ソービニオン・ブラン

などがあり多種多様だった。これを正規表現などを使って ソーヴィニヨン・ブラン という表記に置きかえたかった。

また微妙に似ている品種として カベルネ・ソーヴィニヨン がありこれも.

  • カベルネ
  • カベルネ・ソーヴィニヨン
  • カベルネ・ソーヴィニョン
  • カベルネソーヴィニヨン
  • カベルネソービニオン

という表記があり、更に別の品種として カベルネ・フラン がある。

※ 植物の品種名は親の品種名の一部を受け継いで名付けられるので名前の一部がにてしまうのは仕方ない。

さてさて、話は戻って ソービニオン・ブラン である。以下のように変化させる正規表現は作れるか?というお題。

ソーヴィニヨン ソーヴィニヨン・ブラン
ソーヴィニヨン・ブラン ソーヴィニヨン・ブラン
ソーヴィニヨンブラン ソーヴィニヨン・ブラン
ソービニオンブラン ソーヴィニヨン・ブラン
ソービニオン・ブラン ソーヴィニヨン・ブラン
カベルネ・ソーヴィニヨン カベルネ・ソーヴィニヨン ※こいつは変化しない

/(?<!カベルネ[ ・]?)(ソーヴィニ[ヨョ]ン(?:[ ・]?ブラン)?)/

  • (ソーヴィニ[ヨョ]ン(?:[ ・]?ブラン)?) はなんとなくわかりそう
    • ソーヴィニヨン
    • ソーヴィニョン
    • ・ブランはあってもなくても良い. ・もあってもなくても良い
    • ?: は後方参照しないオプション (あとからマッチした部分を参照しない)
  • (?<!カベルネ[ ・]?) の部分がちょっとむずい
    • これは否定後読みという機能
    • これがあると(ソーヴィニ[ヨョ]ン(?:[ ・]?ブラン)?) のパターンの前に (?<!カベルネ[ ・]?)というパターンがあったらマッチしないようにする書き方
    • これを使わないと、カベルネ・ソーヴィニヨンカベルネ・ソーヴィニヨン・ブラン に変換されてしまう

これに似た正規表現の機能には以下の4つがある。毎回どれがなんだかどう書くのかわからなくなるのでググりながら使っている. また他人の書いた正規表現は読みにくいのでこれを駆使しまくるときは注意。絶対意図がわかるようにテストコード書こうな!!

  • 肯定先読み: (?=)
  • 否定先読み: (?!)
  • 肯定後読み: (?<=)
  • 否定後読み: (?<!)

比較的わかりやすい解説: https://www.javadrive.jp/regex-basic/writing/index2.html

flutterでfastlaneを使う時のおすすめ設定ファイル構成 @takkumattsu

  • fastlane/Fastfile
  • ios/fastlane/Fastfile
  • android/fastlane/Fastfile

fastlane/Fastfile

import "../android/fastlane/Fastfile"
import "../ios/fastlane/Fastfile"

# iOS/Androidどっちでも利用する処理があればここに書くと便利

# 例えばFirebaseのCLIトークンとか
FIREBASE_CLI_TOKEN="XXXXX"
# fvmのインストールチェックとか

ios/fastlane/Fastfile

default_platform(:ios)
platform :ios do
  # ここにiOS用のlaneを書く
end

android/fastlane/Fastfile

default_platform(:android)
platform :android do
  # ここにAndroid用のlaneを書く
end

一個のFastfileで書くよりかなり見やすくなるのでおススメです!

flutterでFirebase App Distributionを利用してアプリを配布する - covelline blogだったり、flutter で flavor を分ける - covelline blogといった記事も書いてるので詳しくはそっちを見てね!