2019年2月10日日曜日

node.jsで、正規表現パターンを簡単に試す処理を作りたい

node.jsは、馴染み深いJavaScriptでコンソールアプリ(ツール)も手軽に作れる!!

これは猛烈に凄い事です。

JavaScriptすらも超える手軽さと言えば、もちろんシェルスクリプトがあるわけですが、どうしても独自文法にならざるを得ないのが泣き所でした。

node.jsがあれば「あっ、こういう小さなツール欲しいな」と思ったら、ぱぱっとJavaScriptで組めてしまえる。

というわけで、簡単に正規表現パターンを試せるコンソールアプリ(ツール)が欲しくなったので作ってみました。


■仕様

  • コンソール(PowerShell)で実行します。
  • コマンドは以下になります。
  • node.exe Regex.js 'パターン' '検査したい文字列'
  • 結果がヒットした時はヒット内容を全て表示します。
  • 結果がヒットしなかった時はその旨通知し終了。


■コード


/**
 * @fileoverview 指定パターンと文字列で正規表現マッチを簡単検査
 * @param {string} process.argv[0] node.exe(システム)
 * @param {string} process.argv[1] 当該PG名(システム)
 * @param {string} process.argv[2] 正規表現パターン
 * @param {string} process.argv[3] 検査したい文字列
 */
/**
 * ルート処理
 */

try{
    
    
    let aParam = new Array();
    
    if(process.argv.length !=4) {
        console.log("パラメータは、「正規表現 値」で入力して下さい。");
        process.exit(1);
    } else {
        aParam[0] = new String(process.argv[2]);
        aParam[1] = new String(process.argv[3]); //値
    }
    proc1(aParam);
} catch(e) {
    procE(e,"root");
}
process.exit(0);

/**
 * メイン処理(正規表現パターンの検査)
 * @param  {array} aParam [0]=正規表現パターン [1]=検査したい文字列
 */
function proc1(aParam) {
    try{
        let oRegex = new RegExp(aParam[0],"gi");
        console.log(aParam[0]);
        let aRes = aParam[1].match(oRegex);
        if(aRes === void 0 ||
           aRes === null) {
            console.log("パターンはマッチしませんでした。");
        } else {
            console.log("パターンは (" + aRes.length + "箇所) マッチしました!");
            let i=1;
            //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
            aRes.forEach(element => {
                console.log("[" + i + "] " + "[" + element + "]");
                i++;
            });
            //@@@@@@@@@@[LOOP-END  ]@@@@@@@@@@
        }
    }catch(e) {
        procE(e,proc1.name);
    }
}

/**
 * エラー処理
 * @param  {object} e
 * @param  {string} sName
 */
function procE(e,sName) {
    try{
        console.log("[" + sName + "でエラー発生]" + e.name + "(" + e.message + ")");
        process.exit(1);
    }catch(e){
        console.log("エラー処理失敗" + e.name + "(" + e.message + ")");
    }

}


↑短くて簡単なコンソールプログラムを、シェルスクリプトじゃなくて、プログラミング言語のJavaScriptでポコポコッと手軽に書ける時代になった!というのは感動しまくりです。

しかも、Visual Studio Code(VS Code)がまたJavaScriptとの相性も良くて、うきうきです。

ちなみに、コメントはJSDOC形式に近づけて書いてみました。

ただし私がどうしても入れたくてやってる、ループの開始と終了の時のマーカーはJSDOCとして認識して欲しくないので従来方式です。

ちなみに、node.jsのコマンドパラメータから直接正規表現パターンを入力してもらうわけですが、この時、¥w+などのエスケープシーケンス文字ってどうするの?という問題があり、少し嵌ってしまいました。

結論を言うと、「¥w+」などとエスケープシーケンス文字入りパターンを入力すると、システムが自動で[string:¥¥w+]などとエスケープしてくれるのです。

だから、入力時には普通にパターンを指定します。

プログラムでもあえて¥を¥¥に変換する処理は入れないです。

逆に、コマンドパラメータに¥¥w+などと入力すると、システムが[string:¥¥¥¥w+]に自動変換してしまうのでパターンが永遠にマッチしなくなります。



node.exe c:¥Temp¥Regex.js  '¥w+' 'Playstation Vita is the best game machine. Of course.'

というようなコマンドを入力すると、パターンがマッチすれば、マッチした箇所を全部表示します。

マッチしない時はその旨を通知して終了します。

ちなみに、ASUS E203MAでもって、冷気こもる部屋でキーボード叩いてたんですが、手が凍りそうでうまく動かない。

キーボードに指が跳ね返されて入力できない・・・。

また低発熱で無音のPCなので、冬はずっと冷えたままのボディなんですよね。