見出し画像

【Node.js】コマンドライン引数から演算子と数字を取り出す方法


はじめに


こんにちは!SHIFT アジャイルサービス部の suzue です。

私は現在、Node.js を実行環境として用いた、アプリケーション開発に取り組んでいます。 その中で、コンソール上からカスタムオプションを用いて、「~以上」と条件を指定し、データの抽出をすることがありました。 それは'>=200'のように、1つの文字列中に演算子と数字が含まれている状態から、演算子と数値を取り出すことが必要となります。

この記事では、その際に使用した方法を1つ、ご紹介します。

入出力例


本記事では具体例として、コマンドライン引数で不等号と数字の文字列を入力し、ある店の商品データから、任意の価格よりも高い商品や低い商品を抽出したい場合のコードを作成しました。

入力

hoge@localhost:~
$ node checkInequalitySign.js '>=200'

出力

入出力例では、'>=200'と引数にとっているため、商品データから価格200円以上のデータを抽出した結果を示しています。

ソースコード


ソースコード全体

const regularExpression = /(<=|>=|===|>|<)(\d+)/;
const match = process.argv[2].match(regularExpression);
const operator = match[1];
const num = parseInt(match[2], 10);

//console.log(match[0]);  '>=200'
//console.log(match[1]);  '>='
//console.log(match[2]);  '200'

const store = [
  {
    食品: "キュウリ",
    価格: 100,
  },
  {
    食品: "トマト",
    価格: 200,
  },
  {
    食品: "レタス",
    価格: 300,
  },
];

switch (operator) {
  case ">": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] > num
    );
    console.log(extractedCommodity);
    break;
  }
  case ">=": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] >= num
    );
    console.log(extractedCommodity);
    break;
  }
  case "<": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] < num
    );
    console.log(extractedCommodity);
    break;
  }
  case "<=": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] <= num
    );
    console.log(extractedCommodity);
    break;
  }
  case "===": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] === num
    );
    console.log(extractedCommodity);
    break;
  }
  default: {
    console.error("不明な演算子");
  }
}

このソースコードは主に3つのブロックに分けられます。

演算子(不等号)と数字の抽出処理

const regularExpression = /(<=|>=|===|>|<)(\d+)/;
const match = process.argv[2].match(regularExpression);
const operator = match[1];
const num = parseInt(match[2], 10);

上記のプログラムによって、 operator には演算子の文字列が、num には数字がそれぞれ格納されます。

商品データ

const store = [
  {
    食品: "キュウリ",
    価格: 100,
  },
  {
    食品: "トマト",
    価格: 200,
  },
  {
    食品: "レタス",
    価格: 300,
  },
];

JSON形式の価格を含む商品データです。

商品抽出

switch (operator) {
  case ">": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] > num
    );
    console.log(extractedCommodity);
    break;
  }
  case ">=": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] >= num
    );
    console.log(extractedCommodity);
    break;
  }
  case "<": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] < num
    );
    console.log(extractedCommodity);
    break;
  }
  case "<=": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] <= num
    );
    console.log(extractedCommodity);
    break;
  }
  case "===": {
    const extractedCommodity = store.filter(
      (commodityData) => commodityData["価格"] === num
    );
    console.log(extractedCommodity);
    break;
  }
  default: {
    console.error("不明な演算子");
  }
}

上記のプログラムによって、演算子の文字列を switch, case 文によって演算子の文字列ごとに各処理を記載することで計算しています。


本編では演算子(不等号)と数字の抽出処理のソースコードについて説明します。

この記事はMDN Web Document 正規表現 を参考に作成しています。


1行目:読み取りたい文字列の設定


const regularExpression = /(<=|>=|===|>|<)(\d+)/;

正規表現で>=などの演算子と数字の並びを示しています。

正規表現の概要

JavaScript における正規表現は、リテラル("abc", "あいう"など)とメタ文字(\d, +, ()など)を組み合わせて、特定のパターン(条件や規則)を表現するための記法です。詳しくはサイトサルにもわかる正規表現入門 を参考にしてください。

正規表現をプログラムとして認識させる方法はいくつかありますが、今回は以下に示すように、スラッシュ/で囲む方法を使用します。

<例>

const regularExpression = /hoge/;

/(<=|>=|===|>|<)(\d+)/の意味

2行目:正規表現のパターンに該当する文字列を記録


const match = process.argv[2].match(regularExpression);

正規表現のパターンを引数として、コマンドラインから入力した文字列に対して match()メソッドを用いています。

参考:MDN Web Docs String.prototype.match()

マッチした文字列は、以下のように記録されます(入力は'>=200'とする)。

<例>

console.log(match[0]); // '>=200'
console.log(match[1]); // '>='
console.log(match[2]); // '200'

<解説>

match[0]は正規表現のパターンが完全一致する最初の文字列を記録しています。

match[1]は 1 つ目の正規表現のグループとマッチしているものが記録しています。

match[2]は 2 つ目の正規表現のグループとマッチしているものが記録しています。

以上のように、match()メソッドは、正規表現のパターンと文字列のマッチした個所を記録します。

3, 4行目:記録した各値を格納


const operator = match[1];
const num = parseInt(match[2], 10);

match()で記録された値を、各変数に格納しています。 演算子は、文字列として変数に格納します。数字はpaseInt()を用いて数値にしています。

参考:MDN Web Docs parseInt()

<例>

paseInt("34", 10) # 34
paseInt("1001", 2) # 9

以上の過程より、文字列から演算子と数字を、それぞれoperatorとnumに格納することができました。

本記事では説明をしませんが、その後にswitch, case 文でoperatorの値それぞれの処理を実行します(商品抽出)。

おわりに


今回の記事では正規表現を活用し、文字列'>=200'から、演算子>=と数字200を取り出す方法について記事にしました。 正規表現はJavaScript初学者にとって、詰まる部分も多いと思いますので、この記事が学習の一助になれば幸いです。

最後まで読んでいただき、ありがとうございました。

参考サイト


MDN Web Document 正規表現:https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_expressions

MDN Web Document String.prototype.match():https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/match

MDN Web Document parseInt():https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt

サルにもわかる正規表現入門:https://userweb.mnet.ne.jp/nakama/#google_vignette


執筆者プロフィール:suzue
株式会社 SHIFT アジャイルサービス部所属。現在はサービス改革部でTech Boostプロジェクトに参画中。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/

PHOTO:UnsplashShahadat Rahman