我确定我曾经知道这一点,而且我确定这会被覆盖,但由于我无法找到任何Google / SO点击此标题搜索,因此可能应该有一个。
我想在不使用正则表达式的情况下拆分字符串,例如
str = "abcx*defx*ghi"
当然,我们可以将stringr::str_split
或strsplit
与参数'x[*]'
一起使用,但我们怎样才能完全抑制正则表达式?
答案 0 :(得分:4)
参数fixed=TRUE
在此实例中很有用
strsplit(str, "x*", fixed=TRUE)[[1]]
#[1] "abc" "def" "ghi"
答案 1 :(得分:1)
由于问题还提到stringr::str_split
, stringr 方式也可能有所帮助。
您可以将str_split
与fixed(<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"
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"