我已经尝试解决这个小问题近2个小时了,但没有成功。我只想用分隔符分隔字符串:一个空格后跟任何字符。在第二个元素中,我想保留分隔符,而在第一个元素中,它不应出现。例子:
x <- "123123 123 A123"
strsplit(x," [A-Z]")
结果是:
"123123 123" "A123"
但是,这不会将字母 A 保留在第二个元素中。
我尝试过使用
strsplit(x,"(?<=[A-Z])",perl=T)
但这并不能真正解决我的问题。如果第二个元素中有空格,也没关系,只需要其中的字符即可。
如果你想遵循你的方法,你需要匹配 1+ 空格followed(即,您需要先行查看)用字母来消耗空格:
> strsplit(x,"\\s+(?=[A-Z])",perl=T)
[[1]]
[1] "123123 123" "A123"
See the PCRE 正则表达式演示 https://regex101.com/r/Lq1cG9/1.
Details:
-
\s+
- 1 个或多个空格(放入匹配值中,因此在分割期间将被删除)
-
(?=[A-Z])
- 大写 ASCII 字母必须立即出现在当前位置的右侧,否则匹配失败(该字母不是匹配值的一部分,并将保留在结果中)
您还可以匹配最后一个非空白字符,后跟 1 个以上空白并使用\K
匹配重置运算符丢弃空格之前的匹配:
> strsplit(x,"^.*\\S\\K\\s+",perl=T)
[[1]]
[1] "123123 123" "A123"
如果字符串包含换行符,请添加 DOTALL 标志,因为默认情况下 PCRE 正则表达式中的点与换行符不匹配:"(?s)^.*\\S\\K\\s+"
.
Details:
-
^
- 字符串的开头
-
.*
- 任何 0+ 个字符,直到最后一次出现后续子模式(即\S\s+
)
-
\\S
- 非空白
-
\\K
- 在这里,删除迄今为止匹配的所有文本
-
\\s+
- 1 个或多个空格。
See 另一个 PCRE 正则表达式演示 https://regex101.com/r/Lq1cG9/2.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)