var App = App || {};
App = {
getDataFromServer: function(){
var self = this,
deferred = $.Deferred(),
requests = [];
requests.push($.getJSON('request/ajax/url/1'));
requests.push($.getJSON('request/ajax/url/2'));
$.when.apply(jQuery, requests).done(function(xhrResponse) {
return deferred.resolve(xhrResponse.result);
});
return deferred;
},
init: function(){
this.getDataFromServer().done(_.bind(function(resp1, resp2) {
// Do the operations which you wanted to do when you
// get a response from Ajax, for example, log response.
}, this));
}
};
App.init();
В POSIX-подобных механизмах регулярных выражений punct
обозначает класс символов, соответствующий функции классификации ispunct()
(проверьте man 3 ispunct
в UNIX-подобных системах). В соответствии с ISO / IEC 9899: 1990 (ISO C90) функция ispunct()
проверяет любой символ печати, кроме пробела или символа, для которого isalnum()
истинно. Однако в настройке POSIX детали того, какие символы принадлежат классу, зависят от текущей локали. Таким образом, класс punct
здесь не приведет к переносу кода, см. Руководство пользователя ICU в C / POSIX Migration .
С другой стороны, библиотека ICU , на котором stringi полагается и полностью соответствует стандарту Unicode, определяет некоторые из charclasses в своей собственной, но четко определенной и всегда переносимой.
В частности, согласно Unicode Стандарт PLUS SIGN
(U+002B
) относится к категории Symbol, Math
(Sm
) (и не является Puctuation Mark
(P
)).
library("stringi")
ascii <- stri_enc_fromutf32(1:127)
stri_extract_all_regex(ascii, "[[:punct:]]")[[1]]
## [1] "!" "\"" "#" "%" "&" "'" "(" ")" "*" "," "-" "." "/" ":" ";" "?" "@" "[" "\\" "]" "_" "{" "}"
stri_extract_all_regex(ascii, "[[:symbol:]]")[[1]]
## [1] "$" "+" "<" "=" ">" "^" "`" "|" "~"
Итак, здесь вы скорее всего, должны использовать такие наборы символов, как [[:punct:][:symbol:]]
, [[:punct:]+]
или даже лучше [\\p{P}\\p{S}]
или [\\p{P}+]
.
Подробнее о доступных классах символов см. ?"stringi-search-charclass"
. В частности, ваш интерес представляет Руководство пользователя ICU по UnicodeSet и Unicode Standard Приложение № 44: База данных символов Юникода . НТН
Символьные классы POSIX должны быть обернуты внутри класса символов, правильная форма будет [[:punct:]]
. Не путайте термин «класс символов» POSIX с тем, что обычно называется классом символов regex.
Этот класс имен POSIX в диапазоне ASCII соответствует всем неконтролируемым , не-буквенно-числовые , символы без пробела .
ascii <- rawToChar(as.raw(0:127), multiple=T)
paste(ascii[grepl('[[:punct:]]', ascii)], collapse="")
# [1] "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
Хотя, если действует locale
, это может изменить поведение [[:punct:]]
...
R Документация ?regex
указывает следующее: Определенные имена классы символов предопределены. Их интерпретация зависит от локали (см. локали ); интерпретация - это языковой стандарт POSIX.
Определение Open Group LC_TYPE для punct говорит:
Определить символы, которые будут классифицироваться как знаки пунктуации .
В локали POSIX не включаются ни
<space>
, ни любые символы в классах альфа, цифра или cntrl.В файле определения локали не указывается ни один символ, указанный для ключевых слов: верхний, нижний, альфа, цифра, cntrl, xdigit или как
blockquote> < / blockquote><space>
.
Однако пакет stringi, похоже, зависит от ICU , а локаль - фундаментальное понятие в ICU.
Используя пакет stringi, я рекомендую использовать Unicode Properties
\p{P}
и\p{S}
.
\p{P}
соответствует любому знаку пунктуации. То есть отсутствует девять символов, которые включает класс POSIX punct . Это объясняется тем, что Unicode разделяет то, что POSIX считает препинанием на две категории, знаки препинания и символы. Вот где\p{S}
встает на место ...stri_replace_all_regex(string1, '[\\p{P}\\p{S}]', ' ') # [1] "this is a test" "this is also a test" # [3] "this is the final test" "this is the final test "
- Или отступите к
gsub
из базы R, которая справляется с этим очень хорошо.gsub('[[:punct:]]', ' ', string1) # [1] "this is a test" "this is also a test" # [3] "this is the final test" "this is the final test "