Word 2010 で、ABC.DEF.XYZ という形式のテキストを検索しようとしています。これは基本的に、Java 構文を使用して Word 文書に書き込まれたコード参照を検索することです。3 要素の参照は単なる例であることに注意してください。実際の参照には、最小 2 要素、最大 5 要素が含まれます。
これを機能させるために、ワイルドカード (およびワイルドカード以外) の組み合わせを多数試しましたが、うまくいきませんでした。私が試したことのいくつかを以下に示します。
<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
注: これは実際には 2 要素の参照を見つけるのに有効です。より大きな文字列内でパターンを見つける場合 (例: 3 要素の参照の要素 2 と 3 の一致) は、うまくいくかうまくいかないかのどちらかです。<([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
エラーが発生します - 無効なパターン<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
実行に時間がかかりすぎるため、Word は 15 分以上停止し、一致するものが 1 つも見つかりませんでした (ドキュメントは約 150 ページのテキストなので、処理するには多すぎたのかもしれません)<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
これを試してみたところ、実際に Word がクラッシュしました。
理想的には、#2 の動作するバージョンが理想的だと思いますが、パターンを有効にする方法がわかりません。
これが不可能な場合は、#1 を使用して、すべてをキャッチすることを期待します (特定の文字列に一致し、他の文字列には一致しない理由はわかりません)。
どのような助けでも大歓迎です。
答え1
Word のワイルドカード検索の代わりに、Word の VBA RegEx エンジンを使用できます。
さて、タスクは次のパターンを持つすべての文字列を見つけることです
###.###
###.###.###
###.###.###.###
###.###.###.###.###
私が作れた最高のパターンは
([\w\d]{3}\.){1,4}[\w\d]{3}
黄色でマークされた次のヒットを返します
パターンの説明
\w
Azの1文字に一致します。大文字と小文字は区別されません。\d
0~9の数字に一致[\w\d]{3}
ABC
、、、-のような 3 文字または数字に一致しますがabc
、またはには一致しません。123
Ab1
A$C
ABCD
([\w\d]{3}\.){1,4}
1、2、3、または4つのグループに次のポイントが一致します\.
。最後のグループ[\w\d]{3}
には次のポイントは必要ありません。
VBAマクロ
ALT+を押しF11てVBAエディタを開きます。コードを任意の場所に貼り付けて実行します。F5
Sub RegExMark()
Dim RegEx As Object
Set RegEx = CreateObject("VBScript.RegExp")
RegEx.Global = True
RegEx.Pattern = "([\w\d]{3}\.){1,4}[\w\d]{3}"
Set Matches = RegEx.Execute(ActiveDocument.Range)
For Each hit In Matches
Debug.Print hit
ActiveDocument.Range(hit.FirstIndex, hit.FirstIndex + hit.Length). _
HighlightColorIndex = wdYellow
Next hit
End Sub
警告
サンプル画像で赤くマークされているように、現在のパターンには欠陥があり、長すぎる文字列の部分文字列にも一致します。 を少し試してみましたが、\b
どれもすべてのケースで機能しませんでした。他のユーザーが有効な解決策を見つけられるでしょうか?[^\.]
\s
使用されたリソース
答え2
テキストを Notepad++ にコピーし、RegEx オプションを使用して変更を加えることをお勧めします。
面倒に聞こえるかもしれませんが、慣れてしまえばプログラム間を非常に素早く移動できるようになります。
RegEx は、Notepad++ の [検索/置換] ウィンドウのオプションです。他のエディターにも同じ機能があります。
イワン
答え3
Word で範囲オブジェクトの find メソッドを本当に使用する必要がある場合は、次の検索ワイルドカードのいずれかを使用して、テキストを複数回実行する必要があると思います。
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@) [!.a-z0-9A-Z]
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]
[!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]
各グループの最初の検索では、ピリオド以外の文字または英数字が続くバージョン番号が検索されます。2 番目の検索では、文末などのピリオドで終わるバージョン番号が検索されます。
これらのワイルドカードは、バージョン番号の前の文字からバージョン番号の後の 2 文字までの選択範囲を検索します。ただし、サブグループは抽出され、割り当てられます。
ワイルドカードを使用した Word の検索方法には 2 つの問題があります。1 つは、Word には特定の文字または同じ文字のグループを 0 個以上指定する方法がないことです。これにより、正規表現関数で処理できるいくつかの簡単な一致方法が排除されます。
2 つ目の問題は、ver # 内のピリオドが単語の終わりのように見えるため、ワイルドカードでのピリオドの使用に対して山括弧が冗長であることです。山括弧は外部でも使用しないでください。少数のサブグループを持つ ver # が多数のサブグループを持つ文字列内で見つかった場合、誤った一致が発生します。
また、「検索」を実行してから「置換」を実行する場合は、「検索」実行によって返される選択範囲の末尾がドキュメントの末尾と同じになるように変更する必要があることも付け加えておきます (この値は事前に保存しておいたほうがよいでしょう)。これは、選択範囲が「検索」テキストと同じ場合、置換コマンドは一致する選択範囲を再度見つけることができないためです。これはワイルドカードを使用しない検索/置換の場合に当てはまることがわかっています。安全を期す方が後悔するよりはましです。