拆分字符串没有正则表达式

时间:2016-05-22 11:11:36

标签: r

我确定我曾经知道这一点,而且我确定这会被覆盖,但由于我无法找到任何Google / SO点击此标题搜索,因此可能应该有一个。

我想在不使用正则表达式的情况下拆分字符串,例如

str = "abcx*defx*ghi"

当然,我们可以将stringr::str_splitstrsplit与参数'x[*]'一起使用,但我们怎样才能完全抑制正则表达式?

3 个答案:

答案 0 :(得分:4)

参数fixed=TRUE在此实例中很有用

strsplit(str, "x*", fixed=TRUE)[[1]]
#[1] "abc" "def" "ghi"

答案 1 :(得分:1)

由于问题还提到stringr::str_split stringr 方式也可能有所帮助。

您可以将str_splitfixed(<YOUR_DELIMITER_STRING_HERE>, ignore_case = FALSE)coll(pattern, ignore_case = FALSE, locale = "en", ...)一起使用。请参阅stringr docs

  

fixed:比较字符串中的文字字节。这非常快,但通常不是您想要的非ASCII字符集   coll比较符合标准整理规则的字符串

请参阅以下R演示:

> str_split(str, fixed("x*"))
[[1]]
[1] "abc" "def" "ghi"

使用可以有两种表示形式的字母可以更好地说明整理:

> x <- c("Str1\u00e1Str2", "Str3a\u0301Str4")
> str_split(x, fixed("\u00e1"), simplify=TRUE)
     [,1]        [,2]  
[1,] "Str1"      "Str2"
[2,] "Str3áStr4" ""    
> str_split(x, coll("\u00e1"), simplify=TRUE)
     [,1]   [,2]  
[1,] "Str1" "Str2"
[2,] "Str3" "Str4"

A note about fixed()

  

fixed(x)仅匹配x指定的确切字节序列。这是一个非常有限的“模式”,但限制可以使匹配更快。小心使用fixed()非英语数据。这是有问题的,因为通常有多种方式来表示相同的角色。例如,有两种方法可以定义“á”:既可以是单个字符,也可以是“a”加上重音。   ...
  coll(x)使用人类语言排序规则查找与x的匹配项,如果您想要进行不区分大小写的匹配,则尤为重要。整理规则在世界各地不同,因此您还需要提供区域设置参数。

答案 2 :(得分:0)

只需将正则表达式包装在fixed()内即可停止将其视为stringr::str_split()内的正则表达式

示例

通常,stringr::str_split()会将pattern视为正则表达式,这意味着某些字符具有特殊含义,如果这些正则表达式无效,则可能会导致错误,例如:

library(stringr)

str_split("abcdefg[[[klmnop", "[[[")

Error in stri_split_regex(string, pattern, n = n, simplify = simplify,  : 
  Missing closing bracket on a bracket expression. (U_REGEX_MISSING_CLOSE_BRACKET) 

但是,如果我们仅包装pattern并在fixed()内部进行拆分,它将把它视为字符串文字,而不是正则表达式:

str_split("abcdefg[[[klmnop", fixed("[[["))
[[1]]
[1] "abcdefg" "klmnop"