你可以寫C++的正則表達式功能的匹配regmatches方法可能不會返回相同的長度,輸入一個字符串,編譯成一個DLL和呼叫他們R.
#include <regex>
extern "C" {
__declspec(dllexport)
void regex_match(const char **first, char **regexStr, int *_bool)
{
std::cmatch _cmatch;
const char *last = *first + strlen(*first);
std::regex rx(*regexStr);
bool found = false;
found = std::regex_match(*first,last,_cmatch, rx);
*_bool = found;
}
__declspec(dllexport)
void regex_search_results(const char **str, const char **regexStr, int *N, char **out)
{
std::string s(*str);
std::regex rgx(*regexStr);
std::smatch m;
int i=0;
while(std::regex_search(s,m,rgx) && i < *N) {
strcpy(out[i],m[0].str().c_str());
i++;
s = m.suffix().str();
}
}
};
R中調用作爲
dyn.load("C:\\YourPath\\RegTest.dll")
regex_match <- function(str,regstr) {
.C("regex_match",x=as.character(str),y=as.character(regstr),z=as.logical(1))$z }
regex_match("abc","a(b)c")
regex_search_results <- function(x,y,n) {
.C("regex_search_results",x=as.character(x),y=as.character(y),i=as.integer(n),z=character(n))$z }
regex_search_results("aaa12aa34xxx", "[0-9]+", 5)
(幾乎)正是我需要的,但正如我開始鍵入'?str_extract'我看到'str_extract_all'和生活是再好不過了。 – dwanderson 2017-06-22 21:36:05