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
| |
var bSEARCH_BY_WORD = 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"); 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;
oSC.Language = "VBScript";
oSC.AddCode( 'Function InBox(prompt,title,default):InBox=InputBox(prompt,title, default):End Function' );
s = Editor.ExpandParameter("$C"); 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; if( (c2.match( /\W/ )) && (cc2 <= 0x7f) ) cc2 = -1;
s = "";
if( (cc1 == -1) && (cc2 == -1) ){
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 );
}
|