[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

A. 関数 the-the

文章を書いていると、時々単語を二重に書いてしまうことがある---例えば "you you" (訳註:原文では実際にこの文の先頭で you が二重になっている。) と書いてしまったりする。個人的には "the" をよく二重に書いてしまう。そ こで、二重になっている単語を見つける関数のことを the-the と呼ぶこ とにする。

まず最初の段階として、取り敢えず次の正規表現を使えば、このような二重の単 語を表現出来そうなことが分る。

 
\\(\\w+[ \t\n]+\\)\\1

この正規表現(の前半)は一つ以上の単語構成文字に続いて一つ以上のスペース、 タブないしは改行がくるものにマッチする。しかし、これでは二行に渡るものは 見つけられない。というのも、最初の単語の終わりに改行が来た場合に、次の行 の同じ単語の後にスペースが来ればマッチしないからである。(正規表現につい ての詳細は、正規表現の検索, や section `Syntax of Regular Expressions' in The GNU Emacs Manual, それに section `Regular Expressions' in The GNU Emacs Lisp Reference Manual, を参照。)

単に単語の部分だけを検索すればよいのではと考えるかもしれないが、これでは `with the' の中の `th' のようなものまで引っかけてしまう。

上とは別の正規表現検索で、単語構成文字に続いて非単語構成文字が続き、更に 最初の単語が来るものにマッチするものがある。次の式で `\\w+' は 一つ以上の単語構成文字にマッチし、`\\W*' は零個以上の非単語構成 文字にマッチする。

 
\\(\\(\\w+\\)\\W*\\)\\1

が、これも役に立たない。

次に私が使っているものを挙げる。これは完全ではないが、十分使いものになる。 `\\b' は単語の始まりもしくは終わりの空文字列にマッチし、 `[^@ \n\t]+' は一つ以上の @ マーク、空白、改行、もしくはタブの いずれでもない文字の連続にマッチする。

 
\\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b

もっと複雑な式を書くことも出来るが、私自身はこの式で十分であると分ったの で、これを使っている。

以下が the-the 関数である。これを使いやすいキーバインディングと共に `.emacs' ファイルに記述している。

 
(defun the-the ()
  "Search forward for for a duplicated word."
  (interactive)
  (message "Searching for for duplicated words ...")
  (push-mark)
  ;; This regexp is not perfect
  ;; but is fairly good over all:
  (if (re-search-forward
       "\\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b" nil 'move)
      (message "Found duplicated word.")
    (message "End of buffer")))

;; Bind `the-the' to  C-c \
(global-set-key "\C-c\\" 'the-the)

以下がテスト用の文章である。

 
one two two three four five
five six seven

関数定義の中の正規表現を上に挙げた他の正規表現で置き換えて、このリストの 上で試してみることも出来る。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Matsuda Shigeki on April, 10 2002 using texi2html