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

A. Функция the-the

Иногда, когда вы пишете текст, вы дублируете слова --- например, "you you" в начале предложения. Я обнаружил, что в очень часто я дублирую слово "the'; поэтому я и дал функции для обнаружения дублированных слов имя the-the.

В качестве первого шага, вы могли бы использовать следующее регулярное выражение для поиска двойных слов:

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

Это регулярное выражение соответствует одному или более символам, из которых состоят слова, за которыми следует один или несколько знаков пробела, табуляции или новой строки. Однако, он не определяет дублированные слова, которые расположены на разных строках, поскольку заканчивающий первое слово знак конца строки отличается от заканчивающего второе слово знака пробела. (Для получения дополнительной информации о регулярных выражениях, смотрите Regular Expression Searches, вместе с section `Syntax of Regular Expressions' in The GNU Emacs Manual и section `Regular Expressions' in The GNU Emacs Lisp Reference Manual.)

Вы можете производить поиск только для дублирующихся символов из которых состоят слова, но это не будет работать, поскольку это выражение будет определять дубликаты, такие как два вхождения `th' в предложении `with the'.

Другое регулярное выражение производит поиск символов составляющих слово, за которым следуют символы не входящие в слово, и дубль слова. Так, `\\w+' соответствует одному или нескольким символам входящим в слово, а `\\W*' соответствует одному или нескольким символам, которые не могут входить в слово.

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

Снова, не очень полезное выражение.

Вот регулярное выражение, которое использую я. Оно не является совершенным, но достаточно хорошо. `\\b' соответсвует пустой строке, находя начало или конец слова; `[^@ \n\t]+' соответствует одному или нескольким вложений символов, к которым не относятся знак @, пробел, знак новой строки или табуляции.

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

Кто-то может написать более сложное выражение, но я обнаружил, что это выражение вполне нормальное, так что я его и использую.

Вот функция the-the, как я ее включаю в свой файл `.emacs', вместе с глобальной привязкой клавиш:

 
(defun the-the ()
  "Производит поиск двойных слов в прямом направлении."
  (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")))

;; Привяжем `the-the' к 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 on March, 10 2004 using texi2html