第 15 章 字符串

String 是对应CharacterVector元素的标量类型。String 能够处理 C语言中字符串char*和C++中字符串srd::string所不能处理的NA值(NA_STRING)。

15.1 创建字符串对象

There are roughly three ways to create a String object, as follows. The first method is to create from a C/C++ string, the second is to create it from another String object, and the third is to create it from one element of a CharacterVector.

创建“ String”对象的方法大致有以下三种。

  • 使用一个C/C ++字符串创建
  • 通过另一个String对象创建
  • 使用CharacterVector的一个元素创建。

15.2 运算符

运算符+=String类型中定义。该运算符允许用户在一个字符串的尾部,添加另一个字符串对象。需要注意的是,运算符+没有为String定义。

执行结果

15.3 成员函数

注意:成员函数replace_first(), replace_last(), replace_all()不会返回被替换后的字符串,而是直接修改了原始字符串的值。

15.3.1 replace_first( str, new_str )

使用新的字符串new_str,替换原始字符串中第一个与str匹配的字符串。

在R中运行结果

可以看到,原始的字符串是ABCD000ABCD,我们希望把里面的strCD的部分,替换为new_str,即BA。从结果看,只有第一处的CD被替换为BA

15.3.2 replace_last( str, new_str )

使用新的字符串new_str,替换原始字符串中最后一个与str匹配的字符串。

在R中运行结果

只有最后一处CD被替换。

15.3.3 replace_all( str, new_str )

使用新的字符串new_str,替换原始字符串中所有与str匹配的字符串。

在R中运行结果

所有的CD都被替换为BA

15.3.7 get_cstring(){string-get-cstring}

将字符串对象转为C语言中的字符串常量,并返回该字符串常量

该函数并不是修改字符串,而是返回一个字符串常量,这和此前的push_xxx()是不同的。

在R中运行结果

15.3.10 代码案例{string-code-example}

// [[Rcpp::export]]
void rcpp_replace(){

    // 替换第一次出现的"ab"
    String s("abcdabcd");
    s.replace_first("ab", "AB");
    // 直接打印String s会报错,
    // 转为C语言中已有的字符串常量类型,打印则没有问题
    Rcout << s.get_cstring() << "\n"; // ABcdabcd

    // 替换最后一处"ab"
    s="abcdabcd";
    s.replace_last("ab", "AB");
    Rcout << s.get_cstring() << "\n"; // abcdABcd

    // 替换每一处"ab"
    s="abcdabcd";
    s.replace_all("ab", "AB");
    Rcout << s.get_cstring() << "\n"; // ABcdABcd
}