将字符动态插入到R中的字符串中

时间:2017-01-06 12:34:04

标签: r stringr

我正在尝试在邮政编码的中间插入一个“+”符号。邮政编码遵循AA111AAAA11AA的模式。我希望在最终数字之前插入“+”,因此输出AA11+1AAAA1+1AA。我已经找到了使用stringr执行此操作的方法,但感觉有一种更简单的方法来执行此操作,即我当前正在执行此操作。以下是我的代码。

pc <- "bt43xx"

pc <- str_c(
      str_sub(pc, start = 1L, end = -4L), 
      "+", 
      str_sub(pc, start = -3L, end = -1L)
      )

pc
[1] "bt4+3xx"

3 个答案:

答案 0 :(得分:4)

以下是一些替代方案。如果//mNavigationView is your navigation view mNavViewHeaderLayout = LayoutInflater.from(MainActivity.this).inflate(R.layout.header_navigation, mNavigationView); //to access content in header view mTextview = (TextView)mNavViewHeaderLayout.findViewById(R.id.textview); 是标量或向量,则所有解法都有效。不需要包裹。其中(3)似乎特别简短。

1)将所有内容(pc)与最后一位数字(.*)匹配,然后将其替换为第一次捕获(即与第一次捕获的部分匹配)第一组parens),加号和第二组捕获(即与最后一位数匹配)。

\\d

2)更短的替代方法是匹配一个数字后跟一个非数字,并将其替换为加号后跟匹配:

sub("(.*)(\\d)", "\\1+\\2", pc)

3)这个甚至比(2)短。它匹配替换匹配的最后3个字符,加上后跟匹配:

sub("(\\d\\D)", "+\\1", pc)
## [1] "bt4+3xx"

4)这个字符串将字符串拆分为单个字符,使用sub("(...)$", "+\\1", pc) ## [1] "bt4+3xx" 在适当的位置插入加号并将字符重新组合在一起。

append

如果已知sapply(Map(append, strsplit(pc, ""), after = nchar(pc) - 3, "+"), paste, collapse = "") ## [1] "bt4+3xx" 是标量(如问题中的情况),则可简化为:

pc

答案 1 :(得分:1)

这个带有sub的正则表达式和两个后向引用应该有效。

sub("(\\d?)(\\d[^\\d]*)$", "\\1+\\2", pc)
[1] "bt4+3xx"
  • \\ d?匹配1或0个数字字符,0-9,并由()捕获。如果至少存在两个数字字符,它将匹配。
  • \\ d [^ \\ d] *匹配数字字符后跟所有非数字字符,并由()
  • 捕获
  • $将正则表达式锚定到字符串
  • 的末尾
  • “\\ 1 + \\ 2”将前两个点中匹配的元素替换为自己,中间替换为“+”。

答案 2 :(得分:1)

sub('(\\d)(?=\\D+$)','+\\1',pc,perl=T)