見出し画像

はじめてのJScript+WSH その7 JScriptで文字列処理

はじめに

JScriptの文字列処理を確認していきます。

よく使う関数

文字列の結合

str1 + str2 で結合します

// 文字列を宣言
var network_address = "192.168.10.0";
var prefix = "24";

// 文字列を結合
var segment = network_address + "/" + prefix;

WScript.echo(segment); => 192.168.10.0/24

文字列の検索

string.search(検索ワード) で検索可能

// 文字列を宣言
var segment = "192.168.10.0/24";
var num;

// "/"を検索
num = segment.search("/");

WScript.echo(num);	// => 12 ※13文字目

// "-"を検索
num = segment.search("-");

WScript.echo(num);	// => -1 ※見つからない場合は-1

文字列の置換

string.replase(置換前, 置換後) で置き換えます

var segment = "192.168.10.0/24";
var str;

// "192.168"を"172.16"に変換
str = segment.replace("192.168","172.16");

WScript.echo(str); // => 172.16.10.0/24

// "172.16"を"10.0"に変換(見つからないのでそのまま)
str = segment.replace("172.16","10.0");

WScript.echo(str); // => 192.168.10.0/24

文字列の分割

array = string.split(文字) で分割します

var segment = "192.168.10.0/24";

// 文字列を"/"で分割
var arr = segment.split("/");

// 分割後の要素を表示
WScript.echo(arr[0]); // => 192.168.10.0
WScript.echo(arr[1]); // => 24

文字列の切り出し

str = string.slilce() で切り出します

var str = "0123456789";

// 右から3文字(マイナスをつける)
WScript.echo( str.slice(-3) );    // => 789

// 左から6文字
WScript.echo( str.slice(0, 6) );  // => 012345

// 左から4文字目以降(=左から3文字を削る)
WScript.echo( str.slice(3) );     // => 3456789

// 左から2文字目~6列目(=左から1文字削って6文字目まで)
WScript.echo( str.slice(1,6) );   // => 12345

正規表現を使った処理

正規表現の使いどころ

例えば、沢山あるセグメントの中から"192.168.10.0または192.168.11.0または192.168.12.0"を検索したい場合、 /192\.168\.[10|11|12]\.0/ という正規表現でヒットさせることができ、非常に便利です。

正規表現の基礎

 192:192という文字列にマッチ
 [10|11|12]:10,11,12のいずれかにマッチ
 [123]:1,2,3のいずれかにマッチ※
 [^123]:1,2,3以外のいずれかにマッチ
 [0-9]:0~9の1文字にマッチ

※[123]は [1|2|3]とも書けるが1文字の場合|を省略可能です


 ^:先頭にマッチ
 $:末尾にマッチ

※^[123]なら先頭の1,2,3のいずれかにマッチ、[^123]なら1,2,3以外にマッチとなります。

 .:改行以外のどの1文字にもマッチ
 \:次の文字をエスケープ(”.”にマッチさせるなら"\."とする

 \s:空白文字に一致
 \S:空白文字以外に一致

 \d:数値にマッチ ※[0-9]と同じ
 \D:数値以外にマッチ※[^0-9]と同じ

 *:直前の文字の0回以上の繰り返し。/\s\d*/だと" "や" 1"," 12"にマッチ
 +:直前の文字の1回以上の繰り返し。/\d+/だと"1"や"12"にマッチ
 {n}:直前の文字をn回一致。/\d{3}/だと"100"や"123”にマッチ

IPアドレスを正規表現で表す場合、
 (([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3} ([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])
となります。(難しい…)
これは、各オクテットの数値は0~255までの値を取るため、256や300といったものをヒットさせないためです。
 \d+\.\d+\.\d+\.\d+
と書くと、192.168.300.1234 といった正しくないセグメントにもヒットしてしまいます
※showコマンドを見るなど、各オクテットに256以上の値が存在しない前提なら\d+でヒットさせてもOKではと思います。

特定のアドレスを抽出する例

// 文字列を宣言
var segments =[
                "192.168.10.0",
                "192.168.11.0",
                "192.168.12.0",
                "192.168.13.0",
                "192.168.14.0",
                "172.16.1.0",
                "172.16.10.0",
                "10.10.10.0"
              ];

// 192.168.10.0, 192.168.11.0, 192.168.12.0 を抽出
for(var i = 0; i < segments.length; i++){
    if(segments[i].search(/192\.168\.(10|11|12)\.0/) > -1){
        WScript.echo(segments[i]);
    }
}

matchでキャプチャグループを使用

matchを用いて正規表現で検索すると、()で囲った部分を配列に格納することができます。
 arr = "ntp server 10.10.1.1 prefer".segments[i].match(/(\d+.\d+.\d+.\d+) prefer/);
とした場合、
 arr[0]はマッチした文字列の全体"10.10.1.1 prefer"
 arr[1]は最初の括弧の中"10.10.1.1"
となります。

// 文字列を宣言
var segments =[
                "scheduler allocate 20000 1000",
                "ntp source Loopback0",
                "ntp server 10.10.1.1 prefer",
                "ntp server 192.168.10.10"
              ];

// preferのある行のIPアドレスを"192.168.10.11"に変換する
for(var i = 0; i < segments.length; i++){
    if(segments[i].search(/\d+\.\d+\.\d+\.\d+ prefer/) > -1){
        var arr = segments[i].match(/(\d+\.\d+\.\d+\.\d+) prefer/);
	segments[i] = segments[i].replace(arr[1], "192.168.10.11");
    }
}

// 変換されたか確認
for(var i = 0; i < segments.length; i++){
    WScript.echo(segments[i]);
}

コメントアウトをする

replace(/\s/g,"")はスペースやタブのすべてを空文字""に置換する
 \s :スペースやタブ、
 /***/gのg:グローバルサーチ。文字列全体に対してマッチングをする。※無指定の場合、1度マッチングした時点で処理を終了。

// 文字列を宣言
var commands =[
                "show run",
                "show ver",
                "",
                "show ip int brie",
                "",
                "!show tech",
                "",
                "show standby brief", 
                " ",
                "show ip route",
                "EOC",
                "show logging"
              ];

// コメントアウト"!"や空行を無視して出力
// また、EOC (end of command)を見つけたらそこで処理を終わりにする
for(var i = 0; i < commands.length; i++){
    if(commands[i].search(/^!/) > -1) continue;	            // 先頭が!なら行を無視
    if(commands[i].replace(/\s/g,"").length == 0) continue; // 空の行を無視
    if(commands[i].replace(/\s/g,"")=="EOC") break;         // EOCを見つけたらforを抜ける

    WScript.echo(commands[i]); // => show run, show ver, show ip int brie, show standby brief, show ip route 
}


おわりに

正規表現はなんとなく難しそうに見えるかもしれませんが、一度理解して使いこなせると非常に強力なツールになります。特にmatchとキャプチャグループを使えこなせると便利です。

参考

次の記事

前の記事


この記事が気に入ったらサポートをしてみませんか?