Как добавить единственный символ обратной косой черты к строке в Ruby?

Для экспериментальных и быстрых проектов я склонен использовать простой текстовый файл, в котором просто хранится s-выражение.

Очень простая база данных:

(format open-file-stream "~S" any-sexp)

Вы можете найти запись, используя несколько простых функций.

Для поиска по (неявному) индексу :

(defun read-nth-sexp (n file)
  (with-open-file 
    (file-stream file) 
    (loop for i from 0 
      for sexp = (read file-stream nil)
      do (if (eq n i) (return sexp)))))

Чтобы найти по ключу : (Примечание: ключ сохраняется, просто добавляя его в sexp в любом месте в структуре sexp, когда вы его сохранили. Позже вы можете получить его, предоставив соответствующую функцию селектора, по умолчанию предполагаемую #'car.)

(defun find-entry (entry file &key (select #'car))
  (with-open-file 
    (file-stream file) 
    (loop for sexp = (read file-stream nil)
      while sexp
      do (if (equal (funcall select sexp) entry)
             (return sexp)))))

Это хорошо работает для 10 000 или, может быть, 100 000 записей, в зависимости от вашего оборудования. У меня были трудности с чем-либо, превышающим полмиллиона записей.


У меня не было необходимости обновлять свои данные, поэтому я никогда не писал никаких функций обновления, но их можно было легко написать.

Для очень быстрого поиска у меня был успех с бинарным поиском, при условии, конечно, что ваши данные имеют сортируемые свойства.

12
задан 3 April 2009 в 21:26
поделиться

3 ответа

из ruby-doc.org о заменяющем шаблоне для gsub:

последовательности \1, \2, и так далее могут использоваться для интерполяции последовательных групп в соответствии

Это включает последовательность \', что означает "все после того, чему я соответствовал".

Также "\\'" или '\\\'' оба произведет \' (помните это \ должен быть оставлен и в двойных и в единственных заключенных в кавычки строках и этом ' должен быть оставлен в единственно заключенных в кавычки строках, таким образом использование одинарных кавычек в этом случае на самом деле делает вещи более подробными). Например:

puts "before*after".gsub("*", "\\'")
"beforeafterafter"

puts "before*after".gsub("*", '\\\'')
"beforeafterafter"

Что Вы хотите gsub видеть затем на самом деле \\', который может быть произведен обоими "\\\\'" и '\\\\\''. Так:

puts s.gsub("'", "\\\\'")
children\'s world

puts s.gsub("'", '\\\\\'')
children\'s world

или если необходимо сделать много с \ Вы могли использовать в своих интересах то, это, когда Вы используете /.../ (или %r{...}) у Вас нет к двойному Escape обратных косых черт:

puts s.gsub("'", /\\'/.source)
children\'s world
14
ответ дан 26 October 2019 в 10:46
поделиться
>> puts s.gsub("'", "\\\\'")
children\'s world
4
ответ дан 26 October 2019 в 10:46
поделиться

Ваша проблема состоит в том, что строка "\'" значима для gsub в замещающей строке. Чтобы заставить его работать способ, которым Вы хотите, необходимо использовать клеточный вид.

s.gsub("'") {"\\'"}
1
ответ дан 26 October 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: