Каковы некоторые различные способы реализовать сменную систему?

Побег с двойной обратной косой чертой

R обрабатывает обратную косую черту как escape-значения для символьных констант . (... и, следовательно, регулярные выражения. Следовательно, необходимо наличие двух обратных косых черт при поставке символьного аргумента для шаблона. Первый - это не символ, а второй - символ). Вы можете видеть как они обрабатываются с помощью cat .

y <- "double quote: \", tab: \t, newline: \n, unicode point: \u20AC"
print(y)
## [1] "double quote: \", tab: \t, newline: \n, unicode point: €"
cat(y)
## double quote: ", tab:    , newline: 
## , unicode point: €

Дальнейшее чтение: Выключение обратной косой черты с обратным слэшем в R вызывает 2 обратных слэша в строке, а не 1

Чтобы использовать специальные символы в регулярном выражении, простейший метод обычно избегает их с обратным слэшем, но, как отмечалось выше, обратная косая черта должна быть экранирована.

grepl("\\[", "a[b")
## [1] TRUE

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

grepl("\\\\", c("a\\b", "a\nb"))
## [1]  TRUE FALSE

Пакет rebus содержит константы для каждого из специальных символов, чтобы сэкономить вам чернильные черты.

library(rebus)
OPEN_BRACKET
## [1] "\\["
BACKSLASH
## [1] "\\\\"

Дополнительные примеры см. в:

?SpecialCharacters

. Ваша проблема может быть решена следующим образом:

library(rebus)
grepl(OPEN_BRACKET, "a[b")

Формировать класс символов

Вы также можете обернуть специальные символы в квадрате b ракеты для формирования класса символов .

grepl("[?]", "a?b")
## [1] TRUE

Два специальных символа имеют особое значение внутри классов символов: \ и ^.

Обратная косая черта должен быть экранирован, даже если он находится внутри класса символов.

grepl("[\\\\]", c("a\\b", "a\nb"))
## [1]  TRUE FALSE

Резерв должен быть только экранирован, если он находится непосредственно после квадратной скобки открытия.

grepl("[ ^]", "a^b")  # matches spaces as well.
## [1] TRUE
grepl("[\\^]", "a^b") 
## [1] TRUE

rebus также позволяет вам сформировать класс символов.

char_class("?")
##  [?]

Использовать существующий класс символов

Если вы хотите совместить все знаки препинания, вы можете использовать символ [:punct:] class.

grepl("[[:punct:]]", c("//", "[", "(", "{", "?", "^", "$"))
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE

stringi сопоставляет это с общей категорией Unicode для пунктуации, поэтому его поведение немного отличается.

stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "[[:punct:]]")
## [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

Вы также можете использовать кросс-платформенную синтаксис для доступа к UGC.

stri_detect_regex(c("//", "[", "(", "{", "?", "^", "$"), "\\p{P}")
## [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

Использовать \ Q \ E escapes

Размещение символов между \\Q и \\E делает механизм регулярного выражения обрабатывать их буквально, а не как регулярные выражения.

grepl("\\Q.\\E", "a.b")
## [1] TRUE

rebus позволяет писать литеральные блоки регулярных выражений.

literal(".")
##  \Q.\E

Не использовать регулярные выражения

Регулярные выражения не всегда являются ответом. Если вы хотите сопоставить фиксированную строку, вы можете сделать это, например:

grepl("[", "a[b", fixed = TRUE)
stringr::str_detect("a[b", fixed("["))
stringi::stri_detect_fixed("a[b", "[")
5
задан jamesh 12 January 2009 в 19:07
поделиться

4 ответа

Существует очень хороший эпизод Радио Разработки программного обеспечения, которым можно интересоваться.

Для дальнейшего использования я воспроизвел здесь "Правила для активаторов" (альтернативная ссылка) данный в превосходном Содействии в Eclipse Erich Gamma, Kent Beck.

  • Правило приглашения - Каждый раз, когда возможно, позвольте другим способствовать Вашим вкладам.
  • Ленивое Правило Загрузки - Вклады только загружаются, когда они необходимы.
  • Безопасное Правило Платформы - Как поставщик точки расширения, необходимо защитить себя от проступка со стороны расширителей.
  • Правило Честной игры - Все клиенты играют по тем же правилам, даже меня.
  • Явное Дополнительное Правило - Объявляет явно, где платформа может быть расширена.
  • Правило разнообразия - Точки расширения принимают несколько расширений.
  • Хорошее Правило Заборов - При передавании управления вне кода, защитите себя.
  • Явное Правило API - разделяет API от внутренностей.
  • Правило устойчивости - После того как Вы приглашаете кого-то способствовать, наденьте? t изменяют правила.
  • Защитное Правило API - Показывает только API, в котором Вы уверены, но быть готовыми показать больше API, поскольку клиенты просят его.
1
ответ дан 15 December 2019 в 01:16
поделиться

Простая сменная архитектура может определить сменный интерфейс со всеми методами, которые должен реализовать плагин. Сменное событие дескрипторов из приложения, и может использовать стандартный код приложения, объекты модели, и т.д. для добиваний цели. В основном то же как Форма ASP.NET делает, за исключением того, что Вы переопределяете вместо реализации.

Никто не преподавал мне эту часть, и я не эксперт, но я чувствую: В целом плагин будет менее стабильным, чем его приложение, таким образом, приложение должно будет всегда сознавать ситуацию и быть, только дают сменные периодические возможности действовать. Если плагин может зарегистрировать Наблюдателя, то вызовы делегату должны пробоваться/ловиться.

2
ответ дан 15 December 2019 в 01:16
поделиться

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

0
ответ дан 15 December 2019 в 01:16
поделиться

В Python можно использовать систему точки входа, обеспеченную setuptools и pkg_resources. Каждая точка входа должна быть функцией, которая возвращает информацию о плагине - имя, автор, установка и функции разрушения, и т.д.

1
ответ дан 15 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

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