はじめての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とキャプチャグループを使えこなせると便利です。
参考
次の記事
前の記事
この記事が気に入ったらサポートをしてみませんか?