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
делает механизм регулярного выражения обрабатывать их буквально, а не как регулярные выражения.
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", "[")
Существует очень хороший эпизод Радио Разработки программного обеспечения, которым можно интересоваться.
Для дальнейшего использования я воспроизвел здесь "Правила для активаторов" (альтернативная ссылка) данный в превосходном Содействии в Eclipse Erich Gamma, Kent Beck.
- Правило приглашения - Каждый раз, когда возможно, позвольте другим способствовать Вашим вкладам.
- Ленивое Правило Загрузки - Вклады только загружаются, когда они необходимы.
- Безопасное Правило Платформы - Как поставщик точки расширения, необходимо защитить себя от проступка со стороны расширителей.
- Правило Честной игры - Все клиенты играют по тем же правилам, даже меня.
- Явное Дополнительное Правило - Объявляет явно, где платформа может быть расширена.
- Правило разнообразия - Точки расширения принимают несколько расширений.
- Хорошее Правило Заборов - При передавании управления вне кода, защитите себя.
- Явное Правило API - разделяет API от внутренностей.
- Правило устойчивости - После того как Вы приглашаете кого-то способствовать, наденьте? t изменяют правила.
- Защитное Правило API - Показывает только API, в котором Вы уверены, но быть готовыми показать больше API, поскольку клиенты просят его.
Простая сменная архитектура может определить сменный интерфейс со всеми методами, которые должен реализовать плагин. Сменное событие дескрипторов из приложения, и может использовать стандартный код приложения, объекты модели, и т.д. для добиваний цели. В основном то же как Форма ASP.NET делает, за исключением того, что Вы переопределяете вместо реализации.
Никто не преподавал мне эту часть, и я не эксперт, но я чувствую: В целом плагин будет менее стабильным, чем его приложение, таким образом, приложение должно будет всегда сознавать ситуацию и быть, только дают сменные периодические возможности действовать. Если плагин может зарегистрировать Наблюдателя, то вызовы делегату должны пробоваться/ловиться.
Как насчет абстрактной фабрики? Ваша основная программа определяет, как абстрактные понятия взаимодействуют друг с другом, но вызывающая сторона должна обеспечить реализацию.
В Python можно использовать систему точки входа, обеспеченную setuptools
и pkg_resources
. Каждая точка входа должна быть функцией, которая возвращает информацию о плагине - имя, автор, установка и функции разрушения, и т.д.