按环视拆分

时间:2019-11-03 09:20:57

标签: r regex regex-lookarounds strsplit

我想将一个字符串拆分为单个字符,但用<>包围的字符除外。因此,<a>bc<d>e将变为<a> b c <d> e。我尝试了(?<!<)(?!>),它似乎可以在正则表达式测试器中工作,但在R的以下代码中却无法工作。我做错了什么?

X = '<a>bc<d>e'
Y = '(?<!<)(?!>)'
unlist(strsplit(X,Y,perl=TRUE))
[1] "<" "a" ">" "b" "c" "<" "d" ">" "e"

2 个答案:

答案 0 :(得分:2)

使用正面环顾四周,而不是负面的环境:

strsplit('<a>bc<d>e', '(?<=[^<])(?=[^>])', perl=TRUE)
## [[1]]
## [1] "<a>" "b"   "c"   "<d>" "e"  

请参见R demo

详细信息

  • (?<=[^<])-向后的正向查找,要求紧靠当前位置左侧的<以外的其他字符
  • (?=[^>])-一个正向超前查询,需要在当前位置的右侧紧邻>以外的其他字符。

答案 1 :(得分:1)

(<[^>]+>|\S)

似乎可以正常工作。这会尝试首先将所有包围的三角括号匹配,如果没有,则匹配单个字符。

Example on Regex101

regmatches(X, gregexpr("<[^>]+>|\\S",X))[[1]]
#> [1] "<a>" "b"   "c"   "<d>" "e"