• 検索結果がありません。

1.5. 検索・置換

1.5.3. フォームとコード

72 (4) 最右最短一致(rightmost-shortest match) 検索式:M[^M]*?Z

xxMxxMxxx<*MxxZ*>xxxZxxxxxxxZxx

(1)では、検索式の「.*」が任意の文字がゼロ個以上あることを示し、それが最 初に(最左で)一致する部分から最大限まで拡張して一致しています。そこで、(2) では「?」をつけて最短一致させると、最初に一致する(最左の)部分から最短で 一致します。次に、(3)では「[^M]*」により M 以外の文字の連続を指定すると、

途中で M が現れることを防ぎ、検索は最右から始まります。ここで「[^M]*」は 最長一致するので、さらに(4)で「?」をつけて真の最短一致をさせます。一致の開 始点が2文字以上のときは次のように「(...)」でグループ化します。

検索式:MN[^(MN)]*?Z

xxMNxxMNxxx<*MNxxZ*>xxxZxxxxxxxZxx

このように厳密に最短一致で検索するときは細かな指定が必要ですが、実際に は(2)の最左最短一致で十分です。TEXTOSではこの場合 M**Z という検索式を使 います。

73 optリテラル リテラル

optワイルドカード ワイルドカード opt正規表現 正規表現

txt検索置換 検索置換 chk大小文字区別 大小文字区別

chk新文書 新文書

Sub ■検索置換() '*****************************************

If chk新文書 2 Then Call 新文書

検索式配列$ = Split(txt検索置換, vbCrLf)

If optリテラル Then Call リテラル

If optワイルドカード Then Call ワイルドカード

If opt正規表現 Then Call 正規表現 End Sub

Sub リテラル()

For Each 検索式 v In 検索式配列$

If 検索式v = "" Then Exit For

If InStr(検索式 v, "=>") = 0 Then '検索の場合…

検索文字$ = 検索式 v 置換文字$ = 検索式 v Else '置換の場合…

検索文字$ = Left$(検索式 v, InStr(検索式v, "=>") - 1) 置換文字$ = Mid$(検索式 v, InStr(検索式 v, "=>") + 2) End If

With Selection.Find '選択範囲検索 .ClearFormatting '検索初期化 .Text = 検索文字$

.Replacement.ClearFormatting '置換初期化 .Replacement.Text = 置換文字$

74 .Replacement.Highlight = True '置換蛍光ペン

If chk文字色 Then .Replacement.Font.Color = BGR$(txt文字色値)

If chk下線色 Then

.Replacement.Font.Underline = wdUnderlineWavy

.Replacement.Font.UnderlineColor = BGR$(txt下線色値) End If

.Replacement.Font.Bold = chk太字

.MatchCase = chk大小文字区別

.MatchWildcards = False 'ワイルドカード:不使用 .Wrap = wdFindStop '末尾で検索終了

.Execute Replace:=wdReplaceAll '全置換 End With

Next End Sub

Sub ワイルドカード()

For Each 検索式 v In 検索式配列$

If 検索式v = "" Then Exit For

If InStr(検索式 v, "=>") = 0 Then '検索の場合…置換式に変換 検索文字$ = 検索式 v

置換文字$ = "^&"

Else '置換の場合…

検索文字$ = Left$(検索式 v, InStr(検索式v, "=>") - 1) 置換文字$ = Mid$(検索式 v, InStr(検索式 v, "=>") + 2)

置換文字$ = 正規表現置換$(置換文字$, "¥$(¥d)", "¥$1", False)

'正規表現の後方参照($1)をワイルドカード(¥1)に直す

End If

With Selection.Find '選択範囲検索 .ClearFormatting '検索初期化

.Text = 拡張ワイルドカード$(検索文字$)

75 .Replacement.ClearFormatting '置換初期化 .Replacement.Text = 置換文字$

.Replacement.Highlight = True '置換蛍光ペン

If chk文字色 Then .Replacement.Font.Color = BGR$(txt文字色値)

If chk下線色 Then

.Replacement.Font.Underline = wdUnderlineWavy

.Replacement.Font.UnderlineColor = BGR$(txt下線色値) End If

.Replacement.Font.Bold = chk太字

.MatchCase = True ' 大小文字区別 .Format = True '書式を含む

.MatchWholeWord = False '単語の一部も検索 .MatchByte = False '全角半角文字を区別しない .MatchPhrase = False '単語間の空白文字を無視しない .MatchSoundsLike = False '類似単語検索をしない .MatchFuzzy = False '曖昧検索をしない

.MatchAllWordForms = False '活用形検索(~)

.MatchWildcards = True 'ワイルドカード:使用 .Wrap = wdFindStop '末尾で検索終了

.Execute Replace:=wdReplaceAll '全置換 End With

Next End Sub

Sub 正規表現()

選択範囲$ = Selection.Text

For Each 検索式 v In 検索式配列$

If 検索式v = "" Then Exit For

If InStr(検索式 v, "=>") = 0 Then '検索の場合…

If InStr(検索式 v, "#") Then '単語境界があるとき

76

検索式v = 正規表現置換$(検索式 v, "#(.+)", "(¥L)($1)=>$$1{*$$2*}", False) 検索式v = 正規表現置換$(検索式 v, "(.+)#", "($1)(¥L)=>{*$$1*}$$2", False) 検索$ = Left$(検索式 v, InStr(検索式 v, "=>") - 1)

置換$ = Mid$(検索式 v, InStr(検索式v, "=>") + 2) Else

検索$ = "(" & 検索式v & ")"

置換$ = "{*$1*}"

End If

Else '置換の場合…

If InStr(検索式 v, "#") Then '単語境界があるとき 検索式v _

= 正規表現置換$(検索式v, "#(.+)=>(.*)¥$1(.*)", "(¥L)$1=>$$1$2$$2$3", False) '例:#(c%)=>[[$1]] --> (¥L)(c%)=>$1[[$2]]

検索式v _

= 正規表現置換$(検索式v, "(.+)#=>(.*)¥$1(.*)", "$1(¥L)=>$2$$1$3$$2", False) '例:(%d)#=>[[$1]] --> (%d)(¥L)=>[[$1]]$2

検索式v = 正規表現置換$(検索式 v, "#(.+)=>(.*)", "(¥L)$1=>$$1$2", False) '例:#(c%)=>QQ --> (¥L)(c%)=>$1QQ

検索式v = 正規表現置換$(検索式 v, "(.+)#=>(.*)", "$1(¥L)=>$2$$2", False) '例:#(%d)=>QQ --> (¥L)(%d)=>$1QQ

End If

検索$ = Left$(検索式 v, InStr(検索式 v, "=>") - 1) 置換$ = Mid$(検索式 v, InStr(検索式v, "=>") + 2) End If

検索$ = 拡張正規表現$(検索$)

置換$ = Replace(置換$, "¥t", vbTab) 'タブコード 置換$ = Replace(置換$, "¥n", vbCrLf) '改行コード

If 正規表現文法違反(検索$) Then Exit Sub

選択範囲$ = 正規表現置換$(選択範囲$, 拡張正規表現$(検索$), 置換$, _

chk大小文字区別) Next

77

Selection = 選択範囲$ '選択位置に出力

Selection.ClearFormatting '書式クリア End Sub

選択範囲$を正規表現を使った置換で処理します。テキストボックスにある検索式配 列のそれぞれについて、検索の場合と置換の場合に分けて処理を選びます。検索の場 合は、検索式に単語境界(#)がある場合は、単語文字列以外の文字(¥L)を後方参照し、

その再生文字を使って、{*…*}で囲みます。たとえば検索式が#c%(語頭が c で始ま る単語)であれば、この検索式を(¥L)(c%)=>$1{*$2*}という置換式に変換します。一 方、%d#(語尾が dで終わる単語)であれば、(%d)(¥L)=>{*$1*}$2という置換式に変 換します。単語境界がなければ、単純に検索式を(…) で囲って検索$、置換$は{*$1*}

とします。

置換の場合(検索式に=>がある場合)は、単語境界(#)があれば、検索式を次のよう に変換します。

#(c%)=>[[$1]]  (¥L)(c%)=>$1[[$2]]

(%d)#=>[[$1]]  (%d)(¥L)=>[[$1]]$2

そして、単語境界の有無にかかわらず、=>の前を検索$とし、=>の後を置換$としま す。

この処理では、正規表現を置換する、という技法を使いますが、そのとき、置換文 字列で後方参照する$をエスケープし、リテラルの$を示すときは$$とします。

これらの単語境界の設定作業は特殊文字を使うヨーロッパ語で必要です。英語文字 だけを対象にするときは単語境界として正規表現の¥bを使えますが、TEXTOSでが英 語を対象とするときも同様に#を使うことができます。

Function 拡張ワイルドカード$(ByVal W$)

W$ = Replace(W$, "¥¥", "!123") '¥¥をエスケープ

W$ = Replace(W$, "¥$", "@@!!") '$をエスケープ

W$ = Replace(W$, "(^|$|¥n)", "^13") '改行コードをワイルドカード式に W$ = Replace(W$, "@@!!", "$") '$を復元

W$ = Replace(W$, "¥t", "^9") 'タブコードをワイルドカード式に

W$ = Replace(W$, ".*", "*") '任意の文字0個以上(最大一致)

78

W$ = Replace(W$, "#", "<") '単語境界(語頭)

W$ = 正規表現置換$(W$, 拡張正規表現$("([¥l|¥]])<"), "$1>", False) '単語境界(語末)

W$ = Replace(W$, "¥.", "@@!!") '.をエスケープ

W$ = Replace(W$, ".", "?") '正規表現の任意の1文字をワイルドカード式に W$ = Replace(W$, "@@!!", ".") '.を復元

W$ = Replace(W$, "¥&", "@@!!") '&をエスケープ W$ = Replace(W$, "&", "¥l+") '単語文字1以上 W$ = Replace(W$, "@@!!", "&") '&を復元

W$ = Replace(W$, "¥+", "@@!!") '+をエスケープ

W$ = Replace(W$, "+", "{1,}") '任意1文字をワイルドカード式に W$ = Replace(W$, "@@!!", "+") '+を復元

W$ = Replace(W$, "¥w", "[A-Za-z0-9_]") '英数字 W$ = Replace(W$, "¥W", "[!A-Za-z0-9_]") '英数字以外

W$ = Replace(W$, "¥d", "[0-9]") '数字 W$ = Replace(W$, "¥D", "[!0-9]") '数字以外

W$ = Replace(W$, "¥l", "[a-zA-Z¥xC0-¥xD6¥xD8-¥xF6¥xF8-¥xFF]") '拡張ラテン文字

W$ = Replace(W$, "¥L", "[!a-zA-Z¥xC0-¥xD6¥xD8-¥xF6¥xF8-¥xFF]") '拡張ラテン文字以外

W$ = Replace(W$, "¥i", "[" & ChrW(&H400) & "-" & ChrW(&H52F) & "]") '拡張キリル文字

W$ = Replace(W$, "I", "[!" & ChrW(&H400) & "-" & ChrW(&H52F) & "]") '拡張キリル文字以外

W$ = Replace(W$, "¥g", "[" & ChrW(&H370) & "-" & ChrW(&H3FF) _ & ChrW(&H1F70) & "-" & ChrW(&H1F73) & "]") 'ギリシャ文字 W$ = Replace(W$, "¥G", "[!" & ChrW(&H370) & "-" & ChrW(&H3FF) _ & ChrW(&H1F70) & "-" & ChrW(&H1F73) & "]") 'ギリシャ文字

79

W$ = Replace(W$, "¥e", "[" & ChrW(&HAC00) & "-" & ChrW(&HD7AF) & "]") 'ハングル

W$ = Replace(W$, "¥E", "!" & ChrW(&HAC00) & "-" & ChrW(&HD7AF) & "]") 'ハングル以外

W$ = Replace(W$, "¥y", "[" & ChrW(&H3300) & "-" & ChrW(&H9FAF) & "]")

'CJK互換漢字、統合漢字、漢字拡張文字

W$ = Replace(W$, "¥Y", "[!" & ChrW(&H3300) & "-" & ChrW(&H9FAF) & "]")

'CJK互換漢字、統合漢字、漢字拡張文字以外

W$ = Replace(W$, "¥v", "[AEIOUaeiou" _

& ChrW(&HC0) & ChrW(&HC1) & ChrW(&HC2) _

& ChrW(&HC8) & ChrW(&HC9) & ChrW(&HCA) & ChrW(&HCB) _ & ChrW(&HCC) & ChrW(&HCD) & ChrW(&HCE) & ChrW(&HCF) _ & ChrW(&HD2) & ChrW(&HD3) & ChrW(&HD4) & ChrW(&HD5) _ & ChrW(&HD9) & ChrW(&HDA) & ChrW(&HDB) & ChrW(&HDC) _

& ChrW(&HE0) & ChrW(&HE1) & ChrW(&HE2) & ChrW(&HE3) & ChrW(&HE4) _ & ChrW(&HE8) & ChrW(&HE9) & ChrW(&HEA) & ChrW(&HEB) _

& ChrW(&HEC) & ChrW(&HED) & ChrW(&HEE) & ChrW(&HEF) _

& ChrW(&HF2) & ChrW(&HF3) & ChrW(&HF4) & ChrW(&HF5) & ChrW(&HF6) _ & ChrW(&HF9) & ChrW(&HFA) & ChrW(&HFB) & ChrW(&HFC) & "]") '母音文 字

W$ = Replace(W$, "¥V", "[!AEIOUaeiou" _

& ChrW(&HC0) & ChrW(&HC1) & ChrW(&HC2) _

& ChrW(&HC8) & ChrW(&HC9) & ChrW(&HCA) & ChrW(&HCB) _ & ChrW(&HCC) & ChrW(&HCD) & ChrW(&HCE) & ChrW(&HCF) _ & ChrW(&HD2) & ChrW(&HD3) & ChrW(&HD4) & ChrW(&HD5) _ & ChrW(&HD9) & ChrW(&HDA) & ChrW(&HDB) & ChrW(&HDC) _

& ChrW(&HE0) & ChrW(&HE1) & ChrW(&HE2) & ChrW(&HE3) & ChrW(&HE4) _ & ChrW(&HE8) & ChrW(&HE9) & ChrW(&HEA) & ChrW(&HEB) _

& ChrW(&HEC) & ChrW(&HED) & ChrW(&HEE) & ChrW(&HEF) _

& ChrW(&HF2) & ChrW(&HF3) & ChrW(&HF4) & ChrW(&HF5) & ChrW(&HF6) _ & ChrW(&HF9) & ChrW(&HFA) & ChrW(&HFB) & ChrW(&HFC) & "]") '母音文 字

W$ = Replace(W$, "¥c", "[BCDFGHJ-NP-TV-Zbcdfghj-np-tv-z" _

80

& ChrW(&HC7) & ChrW(&HD1) & ChrW(&HDF) & ChrW(&HEF) & ChrW(&HF1) &

"]") '子音文字

W$ = Replace(W$, "¥C", "[!BCDFGHJ-NP-TV-Zbcdfghj-np-tv-z" _

& ChrW(&HC7) & ChrW(&HD1) & ChrW(&HDF) & ChrW(&HEF) & ChrW(&HF1) &

"]") '子音文字以外

W$ = Replace(W$, "¥h", "[ぁ-ゞ]") 'ひらがな W$ = Replace(W$, "¥H", "[!ぁ-ゞ]") 'ひらがな以外 W$ = Replace(W$, "¥k", "[ァ-ヴー]") 'カタカナ W$ = Replace(W$, "¥K", "[!ァ-ヴー]") 'カタカナ以外 W$ = Replace(W$, "¥z", "[一-鶴]") '漢字

W$ = Replace(W$, "¥Z", "[!一-鶴]") '漢字以外

W$ = Replace(W$, "¥j", "[ぁ-ゞァ-ヾ一-鶴]") '日本語文字 W$ = Replace(W$, "¥J", "[!ぁ-ゞァ-ヾ一-鶴]") '日本語文字以外

W$ = Replace(W$, "!123", "¥¥") '¥¥を復元

拡張ワイルドカード$ = W$ '返り値 End Function

Function 拡張正規表現$(ByVal W$)

W$ = Replace(W$, "¥¥", "!123") '¥¥をエスケープ

W$ = Replace(W$, "¥&", "@@!!") '&をエスケープ W$ = Replace(W$, "&", "¥l+") '単語文字1以上 W$ = Replace(W$, "@@!!", "&") '&を復元

W$ = Replace(W$, "¥%", "@@!!") '%をエスケープ W$ = Replace(W$, "%", "¥l*") '単語文字0個以上 W$ = Replace(W$, "@@!!", "%") '%を復元

W$ = Replace(W$, "¥#", "@@!!") '#をエスケープ W$ = 正規表現置換$(W$, "#(.+)", "¥L<_$1_>", False) W$ = 正規表現置換$(W$, "(.+)#", "<_$1_>¥L", False) W$ = Replace(W$, "@@!!", "#") '#を復元

W$ = Replace(W$, "¥l", "[a-zA-Z¥xC0-¥xD6¥xD8-¥xF6¥xF8-¥xFF]") '拡張ラテン文字

81

W$ = Replace(W$, "¥L", "[^a-zA-Z¥xC0-¥xD6¥xD8-¥xF6¥xF8-¥xFF]") '拡張ラテン文字 以外

W$ = Replace(W$, "¥i", "[¥u0400-¥u052F]") '拡張キリル文字 W$ = Replace(W$, "¥I", "[^¥u0400-¥u052F]") '拡張キリル文字以外

W$ = Replace(W$, "¥g", "[¥u0370-¥u03FF¥u1F70-¥u1F73]") 'ギリシャ文字 W$ = Replace(W$, "¥G", "[^¥u0370-¥u03FF¥u1F70-¥u1F73]") 'ギリシャ文字以外

W$ = Replace(W$, "¥y", "[¥u3300-¥u9FAF]") 'CJK互換漢字、統合漢字、漢字拡張文字 W$ = Replace(W$, "¥Y", "[^¥u3300-¥u9FAF]") 'CJK互換漢字、統合漢字、漢字拡張文 字

W$ = Replace(W$, "¥e", "[¥uAC00-¥uD7AF]") 'ハングル音節文字 W$ = Replace(W$, "¥E", "[^¥uAC00-¥uD7AF]") 'ハングル音節文字以外

W$ = Replace(W$, "¥v", "[aeiou¥xC0-¥xC6¥xC8-¥xCF¥xD2-¥xD6¥xD9-¥xDD" _ & "¥xE0-¥xE6¥xE8-¥xEF¥xF2-¥xF6¥xF8-¥xFD]") '母音文字

W$ = Replace(W$, "¥V", "[^aeiou¥xC0-¥xC6¥xC8-¥xCF¥xD2-¥xD6¥xD9-¥xDD" _ & "¥xE0-¥xE6¥xE8-¥xEF¥xF2-¥xF6¥xF8-¥xFD]") '母音文字

W$ = Replace(W$, "¥c", "[bcdfghj-np-tv-z¥xC7¥xD1¥xDF¥xEF¥xF1]") '子音文字 W$ = Replace(W$, "¥C", "[^bcdfghj-np-tv-z¥xC7¥xD1¥xDF¥xEF¥xF1]") '子音文字

W$ = Replace(W$, "¥n", "¥r") '改行コード(1) W$ = Replace(W$, "¥h", "[ぁ-ゞ]") 'ひらがな

W$ = Replace(W$, "¥H", "[^ぁ-ゞ]") 'ひらがな以外 W$ = Replace(W$, "¥k", "[ァ-ヴー]") 'カタカナ

W$ = Replace(W$, "¥K", "[^ァ-ヴー]") 'カタカナ以外 W$ = Replace(W$, "¥z", "[一-鶴]") '漢字

W$ = Replace(W$, "¥Z", "[^一-鶴]") '漢字以外

W$ = Replace(W$, "¥j", "[ァ-ヾぁ-ゞ一-鶴]") '日本語文字 W$ = Replace(W$, "¥J", "[^ァ-ヾぁ-ゞ一-鶴]") '日本語文字以外

W$ = Replace(W$, "!123", "¥¥") '¥¥を復元

拡張正規表現$ = W$ '返り値 End Function

82

Function 正規表現置換$(ByVal A$, S$, T$, bolIC As Boolean) obj正規表現.IgnoreCase = Not bolIC '大小文字区別を判定 obj正規表現.Pattern = S$ '検索パターン

正規表現置換$ = obj正規表現.Replace(A$, T$) '置換・代入 End Function

83

関連したドキュメント