【ワイルドカード】英単語を検索する上でのお約束技

英単語を検索する場合のお約束技です。
次のように記述します。(英数字とハイフンからなる単語が検索される)

<[0-9a-zA-Z\-]@>

これを基本形にして、ing形を検索したいなど、単語の接尾辞を指定して検索する場合は、以下のように記述します。

<[0-9a-zA-Z\-]@ing>

はい、そうです。@の後に(>の前に)ingを付ければOKです。
sやed、er、ableなどを付けて検索するなど、さまざまな活用が想像できますね。

では、単語の接頭辞を付けて検索する場合は、どう記述するでしょうか?
例えば、unを頭に持つ単語を検索する場合は、以下のように記述します。

<un[0-9a-zA-Z\-]@>

はい、そうです。<の後にunを付ければOKです。

いずれも<の後、>の前に挿入すると覚えると覚えやすいです。

【ワイルドカード】{1,}と@の違い

以前からワイルドカードの記述で {1,} と @ に違いを認識しながら、明確にその差を理解していませんでした。ちょうどSNSで話題になったため、調べてみましたので、その結果を以下にまとめておきます。

{1,} でダメで @ ならうまく行くケース

例えば、英単語のing形を検索してヒットさせるワイルドカードを考えるとき、以下のような記述を思い付くと思います。

[A-Za-z]{1,}ing

しかし、これではまったくヒットしません。WildLight辞書ライブラリーにある「WLDIC_ECHK_簡易技術英文チェック.txt」で、これを検索するワイルドカードの記述がありますが、以下のように記述します。

[A-Za-z]@ing

そもそも、{,}と@の意味は、ワードの以下の説明から理解しています。

スクリーンショット 2019-05-04 10.50.12

差が良く分からないですよね。{1,} と @ が同じ動きをするという解釈自体が間違っているのかもしれません。

{1,} と @ による検索の動きがどう違うのかを実際にMicrosoft Wordで見てみました。
以下の英文をサンプルにして、{1,} と @ で検索の違いを見てみます。

スクリーンショット 2019-05-04 10.12.111

ヒット数の違いに着目してみます。

{1,} 

Inkedスクリーンショット 2019-05-04 10.13.34_LI

27件がヒットしています。

@

Inkedスクリーンショット 2019-05-04 10.14.04_LI

155件がヒットしています。

実は、27件というのは単語数と同じ、155件は文字数と同じです(カンマ、コンマを含まず)。

スクリーンショット 2019-05-04 10.11.35

どうも @ は1文字ずつヒットするようです。実際にどのような検索範囲になるのかを見てみると、以下のようになります。

{1,} 

スクリーンショット 2019-05-04 10.15.11

@

スクリーンショット 2019-05-04 10.14.36

やはり、前者は単語単位、後者は文字単位でヒットしていることが分かります。

さて、元に戻って、 {1,} ではダメで @ ならうまく行く理由を知りたいのですが、例として上記サンプル英文の「example」を利用して検索してみます。

[A-Za-z]{1,}ple

もちろん、これでは、まったくヒットしません。これを以下のように変えてみたらヒットしました。

[A-Za-z]{1,4}ple

これを「[A-Za-z]{1,3}ple」にすれば「xample」、「[A-Za-z]{1,2}ple」にすれば「ample」、「[A-Za-z]{1}ple」にすれば「mple」がヒットしますが、次の記述だとヒットしなくなります。

[A-Za-z]{1,5}ple

{1,5}の5を4より大きな数字にすると、まったくヒットしなくなります。これは{n, m}のmの数字に影響を受けていることになります。pleの前にm個分の文字が存在しないとヒットしないということのようで、{1,}では無限大の文字数ということになり、何もヒットしないのでしょう。

ところが ple を半角スペースにすると、「[A-Za-z]{1,} 」でも文字数に関係なくヒットするのです。もしかすると{1,}の後の文字数の問題かと「[A-Za-z]{1,}e」を試しましたが、まったくヒットしません。

ん~、良く分かりません。
誰か、この辺りを説明できる方、教えてくださいm(_ _)m

==== < 2019/05/04 17時追記> ====
早速、SNSで反応をいただきました。

{1,}は、先行するパターンがマッチする範囲で一番長い部分で一致し (最長一致)、@は、全体のパターンがマッチする一番短い部分で一致 します(最短一致)

ということで、検索挙動の違いは、この説明通りですね。

また、「[A-Za-z]{1,}ple」の場合、「example」まで最長で一致し、その後に「ple」を探すため、マッチしないという現象になるようです。

情報をくださった方、ありがとうございました。

億万単位を自動で英語置換

某所でWildLightセミナーを開催したのですが、こんな課題をいただきました。

  1. 〇〇〇億〇〇百万円 ⇒ 〇〇,〇〇〇 million yen
    ex. 158億32百万円 ⇒ 15,832 million yen
  2. 〇〇億〇〇百万円 ⇒ 〇,〇〇〇 million yen
    ex. 11億70百万円 ⇒ 1,170 million yen
  3. 〇億〇〇百万円 ⇒ 〇〇〇 million yen
    ex. 6億47百万円 ⇒ 647 million yen
  4. 〇〇百万 ⇒ 〇〇 million yen
    ex. 6百万円 ⇒ 6 million yen
  5. 〇〇〇億〇百万円 ⇒ 〇〇,〇0〇million yen
    ex. 530億2百万円 ⇒ 53,002 million yen
  6. 〇〇億〇百万円 ⇒ 〇,〇0〇 million yen
    ex. 10億9百万円 ⇒ 1,009 million yen
  7.  〇,〇〇〇,〇〇〇千円 ⇒ 〇,〇〇〇 million yen
    ex. 9,144,781 ⇒ 9,144 million yen (下3桁を削除)

これを実現するためのWildLight辞書を作ってみました。
DEMO_変換_和数字を英語へ.txt」として公開しておきました。

辞書の中身は、以下のような記述になっています。

WILDCARD:ON
Zen2Han,[0-9]
([0-9]{1,2})([0-9])億([0-9]{2})百万 \1,\2\3 million 
([0-9])([0-9])億([0-9]{2})百万 \1,\2\3 million 
([0-9])億([0-9]{2})百万 \1\2 million 
([0-9]{1,2})([0-9])億([0-9])百万 \1,\20\3 million 
([0-9])([0-9])億([0-9])百万 \1,\20\3 million 
([0-9])億([0-9])百万 \10\2 million 
([0-9])億 \100 million 
([0-9]{1,3},[0-9]{3}),[0-9]{3}千 \1 million 
([0-9]{1,3}),[0-9]{3}千 \1 million 
([0-9,]{1,11})百万 \1 million 
百万 million 
円 yen

1行目:ワイルドカードモードに切り替えます。
2行目:全角の数字を Zen2Han コマンドで半角に変換します。
3~5行目:「〇〇〇億〇〇百万」を置換します。
6~8行目:「〇〇〇億〇百万」を置換します。
9行目:「〇億」を置換します。
10行目:「〇〇〇,〇〇〇,〇〇〇千」を置換します。
11行目:「〇〇〇,〇〇〇千」を置換します。
12行目:「〇〇〇,〇〇〇,〇〇〇百万」を置換します。
13行目:「百万」を置換します。
14行目:「円」を置換します。

お役に立つようでしたら、お使いくださいませ。

【ワイルドカード】括弧の閉じ忘れチェック

括弧には種類があり、全角半角によっても違いますし、使われ方もさまざまなので、前提条件を決めてチェック方法を考えないといけません。例えば丸括弧ですと、1)やA)というような使い方がされるため、「括弧を開かないで閉じている」というミスのチェックは難しそうです。ただ、日本語の「」や『』などは、そういう使い方がされないと予測されますから、チェックできそうですね。

ここではタイトルにある通り、前提条件として「括弧を開いたのに閉じ忘れたもの」を検出するためのワイルドカードを考えてみましょう。

まず、検索方法を考える上で、もうひとつ前提条件を付けます。それは、括弧ペアは必ずパラグラフの中で閉じているという条件です。私が翻訳で見ている文書を思い返しても、括弧ペアが文をまたぐのを見たことがありません。つまり、1文内にある括弧は必ずその1文の中で開いて閉じるということになります。言い換えれば、括弧を開いて閉じ忘れた状態とは、閉じる括弧が文末になっても現れない状態のことをいいます。

文末を知る上で使えそうなのは、英文であればピリオド、日本文であれば句点などでしょう。ただ、調べる種類が増えそうですので、検索文を簡略化するために少々乱暴ですが、改行コード ^13 を使うことにします。

[\(\[(「『【][!\)\])」』】]@^13

最初の [(](「『【] は括弧を開いたところを検索。続く [!)])」』】]@ で開いた括弧に続いて、閉じ括弧以外の文字列の連続を検索し、括弧が閉じないまま改行コード ^13 が見つかれば、検索式にヒットします。

これで対応できる括弧ペアは、() [] 「」『』【】です。他の括弧ペアもチェックしたいときは、この検索式に盛り込めば利用できます。

 ※ この記述方法の制限として、括弧の入れ子は検出できません。

 

【ワイルドカード】【英文】「.」「,」のダブルクォーテーション内への入れ忘れチェック

文末のピリオドやカンマをダブルクォーテーションの前に置くか後ろに置くかは、[米][英]での違いとかマニュアルでの指示などで違いがあります。手元にある The Chicago Manual of Style (第16版)の 6.9 Periods and commas in relation to closing quotation marks. には以下のように書かれています。

Periods and commas precede closing quotation marks, whether double or single.

今回紹介するワイルドカードは、この Chicago Manual に則ったスタイルかどうかをチェックできるものになります。考え方として、ピリオド(.)もしくはカンマ(,)がダブルクォーテーション(“)の後についているものを、単純に検索するワイルドカードを考えます。

まず、ピリオドもしくは(or)カンマのいずれかをヒットさせたいときは、角括弧で囲みます。(or の時は角括弧の中に並べちゃえばOKです。)
[.,] と記述することで、. か , が検索でヒットします。次に、これらがダブルクォーテーションの後にある場合をヒットさせたいので、以下のような記述になります。

"[.,]

とりあえず、この記述で検索にヒットした箇所をチェックすれば、スタイルミスが見つかることになります。

では、強制的にピリオドもしくはカンマを、ダブルクォーテーションの前に移動してしまうワイルドカードを考えてみましょう。上の[.,]の記述では、ピリオドかカンマがヒットするので、ヒットしたものをそのまま利用することを考えないといけません。したがって、この記述を丸括弧で囲み、([.,]) と記述することで \1へ代入して再利用できるようにします。

検索する文字列

"([.,])

置換後の文字列

\1"

上記のような記述で、ダブルクォーテーションの後にあるピリオドとカンマが、ダブルクォーテーションの前に移動します。

実行する場合は、必ず、置換後の文字列に蛍光ペンをつけるようにして、必要な箇所のみが置換されていることを確認しましょう。(「検索と置換」窓で、「置換→書式→蛍光ペン」です)

 

【ワイルドカード】全角丸括弧の一括半角置換(半角丸括弧の一括全角置換を含む)

英文にせよ和文にせよ、丸括弧に全角や半角が混在し、揃っていない訳文を見掛けることがあります。以下の前提のもとに、強制的に丸括弧を半角、もしくは全角に揃えるワイルドカードを記述してみたいと思います。

【前提】

  • 半角にせよ全角にせよ、丸括弧はちゃんと対になっていること。
  • その組合せは、半角全角()、全角半角()、全角全角()、半角半角()の4通りとする。

この前提に従い、これらの4通りの組合せをヒットさせるためには、以下のように記述します。

検索する文字列

[\((](*)[\))]

次に「置換後の文字列」の記述の仕方ですが、すべて全角の丸括弧へ揃える場合は、以下のように記述します。

置換後の文字列:(丸括弧は全角です。)

(\1)

この記述から分かるとおり、正しい全角の丸括弧の組合せであっても、強制的に置換してしまうということです。ワイルドカードの記述を考えるとき、正しいものを回避しようと考えてしまい、1文で記述できずに悩んでしまうことが多いですが、正しいものも置換してしまうというアプローチを取れば、1文で表現できることが多いです。

では、次にすべて半角の丸括弧へ揃えて置換するための「置換後の文字列」を記述をします。

置換後の文字列:(丸括弧は半角です)

(\1)

 

【ワイルドカード】【英文】単語間のスペースが2つ以上あるものをチェック

英訳文で、単語の間にスペースが2つ以上入っているものがときどき見られます。これをチェックするためのワイルドカードの記述方法を考えてみましょう。

一番簡単なのは以下の記述かもしれません。スペースが2つ以上あれば、すべて蛍光ペンを付けてしまえという発想です。

[ ]{2,}

文末のピリオドの後はスペース2つというルールの場合だと、それもヒットすることになって、少し都合が悪いですね。では、スペースの前がピリオドでないときにヒットするようにしてみましょう。

[!.][ ]{2,}

この場合、気をつけなくてはならないのは No. とか Dr. や Mr. などの後のスペースはチェックされないということです。チェックの方法を考えるときは、どこまでチェックするかを冷静に考えて判断するようにします。

では、この検索方法を使って、2スペース以上あったときは、強制的に1スペースになるように置換してみましょう。

検索する文字列

([!.])([ ]){2,}

置換後の文字列

\1 \2

間は半角スペース1つです。意図的に2スペース以上入力されているところも置換されてしまいますから、注意しましょう。

【ワイルドカード】数字列から任意の桁数を抜いて、別形式の番号体系に置換する。

決められた番号体系に基づいて付与された管理番号の一部を、他の番号体系へ転記して、新たな番号を作らなくてはならない・・・というようなことが、事務処理の中ではよく発生します。

例として、以下のようなものを想定してみましょう。

例)Aから始まる9桁の番号があり、うしろ8桁の数字部を抜き出し、抜き出した数字部の後にUS01を付与して、新しい番号を作成して置き換える。

A12345678  →  12345678US01

ワードの置換機能を使い、「ワイルドカードを使用する」をONにして、以下の記述を行います。

検索する文字列

<A([0-9]{8})

置換後の文字列

\1US01

検索する文字列は、Aから始まり、続いて8桁の数字を持ったものを検索するように記述してあり、その8桁の数字は()で閉じることで\1へ代入されます。置換後の文字列の\1にその8桁の数字が展開され、その後にUS01が付与されることになります。

【ワイルドカード】【英文】文末(ピリオド後)の2スペースチェック

スタイルガイドによっては、英訳文の文と文の間に2スペースを要求するものがあります。そのルールが守られているかをチェックします。

ワードの検索機能を使い、「ワイルドカードを使用する」をONにして、以下の記述を行います。

検索する文字列

[! ]>.[ ][! ]

ピリオドの後に1スペースしかないものがヒットします。(3スペース以上のものはヒットしない。3スペース以上の場合は [! ]>.[ ]{3,}[! ] となります。)

では、指定された2スペースではないものを、置換により強制的に2スペースにしてしまう方法を考えてみましょう。

上記の記述では1スペースのものしかヒットしません。3スペース以上のものはヒットしないことになります。それぞれを記述しようとすると2文になってしまいますので、1回の置換では処理できなくなってしまいますね。ならば、正しい2スペースのものも含め、1スペース以上あるものを検索でヒットさせ、それを変換するというアプローチを取れば、1回の置換で処理ができます。

検索する文字列

([! ]>.)[ ]{1,}([! ])

置換後の文字列 (\1と\2の間は半角スペース2個です)

\1  \2

これですべての文の間は2スペースに置き換わります。ただし、No. 1 とか Fig. 2 などのピリオドの後ろも2スペースになりますから、注意が必要です。

それを回避する策として以下の記述が考えられますが、行頭が数字で始まる文はすべて、直前のスペースは修正されませんから注意してください。

検索する文字列

([! ]>.)[ ]{1,}([!0-9 ])

【ワイルドカード】【英文】改行コード前の余分な半角スペースチェック

英訳文の文末に余計なスペースが入っているケースを見掛けます。
それを検索して蛍光ペンをつける方法を以下に書きます。

ワードの検索機能を使い、「ワイルドカードを使用する」をONにして、以下の記述を行います。
この記述の意味は、改行コード^13の前にある連続する半角スペースを検索しています。

検索する文字列

[ ]{1,}^13

「検索された項目の強調表示」を選択すると、該当箇所に蛍光ペンが付きます。

次に、この余分な半角スペースを除去するための記述を書きます。

検索する文字列(上と同じです)

[ ]{1,}^13

置換後の文字列

^p

検索でヒットした余分な半角スペースと改行コードを、1つの改行コードで置き換えることで、余分は半角スペースを消してしまいます。