Node.jsの正規表現でSlackのメッセージをフィルタリング

Created 2020年2月27日1:06
Updated 2020年2月27日1:09
Categories nodejs

SlackでOutgoing WebhookからFaaSに投稿を飛ばして、メッセージによってはFaaSから投稿を行なうみたいな事をしたいシチュエーションがありました。

今回はNode.jsで投稿をフィルタリングするため、正規表現やSlackのメッセージの仕様について調べてみました(投稿を受け取る部分は扱いません)。

余談ですが、Node.jsってNodeって略すのが一般的ですよね。

NodeだけだとイマイチJavascript感がなくて実感が沸かないです・・・慣れですかねw

要件

  • エラーフォーマットは @channel error/warning targetService
  • targetService を文字列として取りたい
  • targetService は英数字で構成

正規表現

const regex = /<\!channel>\s-\s(error|warning)\s([a-zA-Z0-9]+)/

もっと良い方法があるかもしれませんが、ポイントとしては

  • Slackで @channel はNode側(WebHook受け取り側)では <!channel> になるようです(環境によるかもしれません)
  • ! はエスケープ( <> などは不要 )
  • 空白は \s
  • グループでエラーフォーマットの対応とtargetServiceを取得

グループは2つあるため、targetServiceを受け取るためには

const testSlack = (message) => {
    if (regex.test(message)) {
        return message.match(regex)[2]
    } else {
        return undefined
    }
}

みたいな感じで、配列の3つ目を指定すれば良さそうです(インデックス0にはマッチした文字列全体が入ります)。

所感

Slackのメッセージは見た目とはちょっと違う形でNodeに渡されていて戸惑いました。

余談ですが、正規表現は書けると気持ちが良い一方で、よっぽど慣れていない限り後々になって問題が発生しがちな気がします。

あまり複雑にしすぎず、なるべくシンプルな形で使う事をおすすめします。

コメントを投稿

コメント