Macro/投稿/219

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F219


Top > Macro > 投稿 > 219

文字列の出現回数カウント

  • ページ: Macro/投稿
  • 作者: jj?
  • カテゴリー: js
  • 投稿日: 2013-08-31 (土) 21:12:16

メッセージ

指定した文字列の出現回数を数えます。
(置換で「すべて置換」すれば「n箇所を置換しました。」と表示してくれるし、大まかでよければgrepの「現在編集中のファイルから検索」で分かるので、出現回数を知りたいことが偶にしかなければそれで済みますが・・・。)

  • 単語単位で探したい場合、11行目 var bSEARCH_BY_WORD = false; を false → true に変更してください。
  • 英大文字・小文字を区別したい場合、15行目 var bMATCH_CASE = false; を false → true に変更してください。
fileCountString.js
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 [概要]
	文字列の出現回数カウント
	文字列の出現回数を数え、メッセージボックスで表示します。
 [変更履歴]
	2013/02/01	新規
*/
 
// 単語単位で探すか。(半角のみ対応)
//		true=単語単位で探す / false=しない
var bSEARCH_BY_WORD    = false;
 
// 英大文字・小文字を区別するか。
//		true=区別する / false=しない
var bMATCH_CASE        = false;
 
 
 
Main();
 
function Main()
{
    var CAPTION        = Editor.ExpandParameter("$M").replace( /^.*\\/, "" );    // メッセージボックスのタイトル
    var WshShell    = new ActiveXObject("WScript.Shell");
    var oSC            = new ActiveXObject("ScriptControl");    // InputBox
    var s;
    var sSearchStr;
    var sContents;
    var sRe, sReFlag;
    var c1, c2, cc1, cc2;
    var ary;
    var nCount;
    var dt1, dt2, ms, MS, SS, MM;        // (処理時間の表示用)
    
    
    // InputBox
    oSC.Language = "VBScript";
    oSC.AddCode( 'Function InBox(prompt,title,default):InBox=InputBox(prompt,title, default):End Function' );
    s = Editor.ExpandParameter("$C");            // InputBoxの初期値
    do{
        var prompt =
            "指定した文字列の出現回数を\r\n" +
            "カウントします。\r\n" +
            "\r\n" +
            "大文字・小文字は区別" + ( bMATCH_CASE ? "されます。" : "されません。" ) + "\r\n" +
            ( bSEARCH_BY_WORD ? "単語単位で探します。\r\n" : "" );
        s = oSC.Run( "InBox", prompt, CAPTION, s );
        if( typeof s == "undefined" ) return;    // キャンセルされた
    }while( s == "" );
    sSearchStr = s;        // カウントする文字列。
    
    // 文書の全内容を取得。
    Editor.SelectAll();
    sContents = Editor.GetSelectedString(0);
    Editor.CancelMode();
    
    // カウントする文字列の正規表現。
    // 正規表現で扱う特殊文字の前に、バックスラッシュを付加する。
    sRe = sSearchStr.replace( /(\W)/g, "\\$1" );        // 簡単の為、記号類(や全角文字など)はすべて。
    sReFlag = (bMATCH_CASE) ? "g" : "ig";
    dt1 = new Date();
    if( bSEARCH_BY_WORD ){
        c1 = sSearchStr.charAt( 0 );                        // 先頭の文字。
        c2 = sSearchStr.charAt( sSearchStr.length -1 );        // 末尾の文字。
        cc1 = c1.charCodeAt( 0 );
        cc2 = c1.charCodeAt( 0 );
        if( (c1.match( /\W/ )) && (cc1 <= 0x7f) ) cc1 = -1;        // -1なら記号類とする。
        if( (c2.match( /\W/ )) && (cc2 <= 0x7f) ) cc2 = -1;
        
        // 先頭(や末尾)が記号類の場合、その文字が先頭(や末尾)に連続する箇所を消す(マッチさせない)。
        s = "";
        if( (cc1 == -1) && (cc2 == -1) ){
            // 例: #A% → "#+" + "#A%" + "%*" | "#*" + "#A%" + "%+" = /#+#A%%*|#*#A%%+/g
            //		"#A%-#A%"/"#A%#A%":一致、"##A%"/"#A%%":不一致
            // 例: #A# → "#+" + "#A#" + "#*" | "#*" + "#A#" + "#+" = /#+#A##*|#*#A##+/g
            //		"#A#-#A#":一致、"##A#"/"#A##"/"#A##A#":不一致
            // 例: # → "#+" + "#" + "#*" | "#*" + "#" + "#+" = /#+##*|#*##+/g (= /#{2,}/g)
            //		"#-#":一致、"##"/"###"/"####":不一致
            s = "\\" + c1 + "+"  + sRe +  "\\" + c2 + "*"  + "|" +
				"\\" + c1 + "*"  + sRe +  "\\" + c2 + "+";			// 処理時間が一番掛かる。
		}else if( cc1 == -1 ){
			// 例: #A → "#+" + "#A" = /#+#A/g		// "#A-#A"/"#A#A":一致、"##A":不一致
			s = "\\" + c1 + "+"  + sRe;
		}else if( cc2 == -1 ){
			// 例: A% → "A%" + "%+" = /A%%+/g		// "A%-A%"/"A%A%":一致、"A%%":不一致
			s = sRe +  "\\" + c2 + "+";
		}
		if( s.length ) sContents = sContents.replace( new RegExp( s, sReFlag ), "\uffff" );
		
		// 先頭(や末尾)が単語の構成要素文字の場合、単語の区切りを付加。
		if( c1.match( /\w/ ) ) sRe = "\\b" + sRe;
		if( c2.match( /\w/ ) ) sRe = sRe + "\\b";
	}
	
	// 検索実行。
	ary = sContents.match( new RegExp( sRe, sReFlag ) );
	nCount = (ary == null) ? 0 : ary.length;
	
	dt2 = new Date();
	s = "[" + sSearchStr + "]\r\n" +
		"の出現回数は\r\n" +
		nCount + " 回です。\r\n";
	ms = dt2.getTime() - dt1.getTime();		//[ms]
	if( ms >= 2000 ){
		// 時間がある程度掛かったら処理時間を表示しておく。
		MS = ms % 1000;
		SS = Math.floor( ms/1000 ) % 60;
		MM = Math.floor( ms/1000/60 );
		s += "\r\n(処理時間: " + (MM ? MM+"" : "") + SS + "." + ("00"+MS).slice(-3) + "秒)\r\n";
	}
	WshShell.Popup( s, 0, CAPTION );
}


こちらはHTA(mshta.exe)をダイアログ代わりに使ったものです。英大文字小文字や単語単位がチェックボックスのオン・オフで選択できます。
(2014/05/31) プラグイン[Command]からの呼び出しに対応。
(2014/05/14) IE10以降で「スクリプト エラー」が出るのを修正。

fileCountStringHta.zip

旧版: fileCountStringHta.20140514.zip fileCountStringHta.20130831.zip



URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル: fileCountStringHta.zip 188件 [詳細] fileCountStringHta.20140514.zip 166件 [詳細] fileCountStringHta.20130831.zip 162件 [詳細] fileCountString.js 237件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2014-05-31 (土) 23:03:17 (1421d)