« 統一 スラッシュ | Main | 翻訳の正規表現 セミナー資料 »

2013.11.06

統一 括弧(ワード)

括弧の統一に関する正規表現のまとめをしました。今の日本語の文書には、漢字、平仮名、片仮名のような全角文字だけではなく、半角または全角の英数字記号も頻繁に使われます。その中で使われる括弧にも全角半角があり、その扱いについては詳しいスタイルガイドがなく、各自の工夫に任されています。

これもそのような工夫の一つに過ぎませんが、英文和文混在のテキストに対応し、全角半角括弧の並存する文書に対応できるようにしてあります。整理してみると、色々な場合があり長めの処理となりました。

この処理では、和文だけ、或いは英文だけの中に括弧が入っている場合のほかに、括弧の内外の文字種が異なるときの括弧の取扱も考えています。つまり英文と和文という異なる文字種の相対関係により、どの括弧を使うと見やすくなるのか、半角スペースを入れるべきかなどを検討してあります。

場合分けで追加してあるのは、括弧の中の文字種による区分(英文だけ、和文だけ、混在)と、括弧の中と前後の文字種が異なるとき(外が英文で中が和文、外が和文で中が英文)です。これは大方が一連の処理の後半部にまとめてあります。

取扱いの方針としては、(1)括弧の中に英文と和文が混在するときは、全角括弧を使う。(2)括弧の中が英文のみで外が和文のときは、半角括弧にし半角空白を入れる。(3)括弧の中が和文のみまたは混在で外が英文のときは、全角括弧を使う、ということにしました。

括弧の統一をどのようにするのか、その方針は各自が決めることです。またクライアントの指定があるかも知れません。新たなパターンが出てくることもあります。いずれにせよ正規表現はそれに合わせて、常に改変していく必要があります。そこで大切になるのは、どのような検索条件なのかを言葉にすること、その自然言語での表現を推敲しながら次第に正規表現に近付けていくことです。注釈の日本語と具体的な正規表現を見比べるのが理解の捷径でしょう。

また処理が多くなると各処理が相互に影響し合う場合が出てきます。個別の処理ではその正規表現を学ぶことが主眼となりますが、多数の処理が繋がっているときには各処理を正しく並べることが大切になります。思わぬ干渉を防ぐためには、様々な事例を使って点検します。おかしな動きが出たら、面倒かもしれませんがその場所を辛抱強く探し出して、徹底的にバグを潰していく必要があります。それにより今後楽になることと比べたら僅かな手間です。

そのままご自分のマクロに取り込んでもいいし、個別の処理だけを使うこともできます。ただし部分だけ使うときはループに陥ることもありますから処理の順番にご注意下さい。

以上、ご活用いただければ幸いです。

Sub 統一括弧()

' まず和文の中の半角を全角に

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "([! -~])\(([! -~])" '括弧開
.Replacement.Text = "\1(\2"
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True 'ワイルドカードオン
.MatchFuzzy = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
.Text = "([! -~])\)([! -~])" '括弧閉
.Replacement.Text = "\1)\2"
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
.Text = "([! -~])\)" '括弧閉末尾
.Replacement.Text = "\1)"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 和文全角括弧の前後の全角空白を削除

With Selection.Find
.Text = "[ ]{1,}("
.Replacement.Text = "("
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
.Text = ")[ ]{1,}"
.Replacement.Text = ")"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 和文全角括弧の前後の半角空白を削除

With Selection.Find
.Text = "[ ]{1,}("
.Replacement.Text = "("
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
.Text = ")[ ]{1,}"
.Replacement.Text = ")"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 次に英文の中の全角を半角に

With Selection.Find
.Text = "([ -~])("
.Replacement.Text = "\1("
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
.Text = ")([ -~])"
.Replacement.Text = ")\1"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 英文半角括弧の前が半角空白以外の英数字記号なら半角空白を付加
With Selection.Find
.Text = "([\!-~])\("
.Replacement.Text = "\1 ("
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 半角英数字+半角空白+半角括弧で括弧内が和文なら半角空白を削除し括弧を全角に
With Selection.Find
.Text = "([\!-~]) \(([! -~]{1,})"
.Replacement.Text = "\1(\2"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 括弧内が和文なら半角括弧を全角に
With Selection.Find
.Text = "([! -~]{1,})\)"
.Replacement.Text = "\1)"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 英文半角括弧の後が半角空白ピリオドカンマ以外の英数字記号なら半角空白を付加
With Selection.Find
.Text = "\)([\!-+\-/-~])"
.Replacement.Text = ") \1"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 前後が和文で括弧内が英数字記号のみなら半角空白を付加
With Selection.Find
.Text = "([! -~])\(([ -'*-~]{1,})\)([! -~])"
.Replacement.Text = "\1 (\2) \3"
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
.Text = "\(([ -'*-~]{1,})\)([! -~])" '半角括弧内が英文でそのあと和文を検索
.Replacement.Text = "(\1) \2"
End With
Selection.Find.Execute Replace:=wdReplaceAll

' 前が和文で括弧内が英数字記号のみなら半角空白を付加
With Selection.Find
.Text = "([! -~])\(([ -'*-~]{1,})\)"
.Replacement.Text = "\1 (\2)"
End With
Selection.Find.Execute Replace:=wdReplaceAll

'半角括弧開の次に英数字記号があり和文が続き全角括弧閉があるときは、前の半角括弧を全角に
With Selection.Find
.Text = "\(([ -'*-~ -'*-・]{1,}))"
.Replacement.Text = "(\1)"
End With
Selection.Find.Execute Replace:=wdReplaceAll

'和文に続き半角の空白と括弧以外の英数字記号があり半角括弧閉があればその半角括弧を全角に
With Selection.Find
.Text = "([ -'*-・]{1,})([\!-'*-~]{1,})\)"
.Replacement.Text = "\1\2)"
End With
Selection.Find.Execute Replace:=wdReplaceAll

'英数字に続き和文を入れた半角括弧があればその半角括弧を全角に
With Selection.Find
.Text = "([\!-'*-~]{1,})\(([ -'*-・]{1,})"
.Replacement.Text = "\1(\2"
End With
Selection.Find.Execute Replace:=wdReplaceAll

End Sub

|

« 統一 スラッシュ | Main | 翻訳の正規表現 セミナー資料 »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/20048/58528577

Listed below are links to weblogs that reference 統一 括弧(ワード):

« 統一 スラッシュ | Main | 翻訳の正規表現 セミナー資料 »