使用带正向预查的正则调用strsplit()时字符串分割位置错误问题
解决strsplit分割日期时间标记时的首字符截断问题
我来帮你搞定这个问题!你遇到的首字符截断问题,根源在于你的正则表达式没有排除字符串的起始位置——strsplit会在匹配到的所有位置分割,包括字符串最开头的位置,这就导致了意外的截断。
修正方案
我们只需要在正则里加上(?!^)这个负向预查,确保不会在字符串起始位置分割,同时保留正向预查来定位日期时间标记的前置位置。修正后的代码如下:
TEST <- c("05.10.17, 09:26 - Person One: How about we chill on sunday\n05.10.17, 09:27 - Person One: I could bring some beer\n05.10.17, 09:27 - Person Two: Sounds good, we could go to Lindas Party afterwards\n05.10.17, 09:27 - Person One: shit man, not LiNDA -.-\n05.10.17, 09:27 - Person Two: ???\n05.10.17, 09:28 - Person Two: You guys have history?\n05.10.17, 09:28 - Person One: She killed my family and sold their ears as souvenirs\n") # 修正后的strsplit代码 Cut <- unlist(strsplit(TEST, "(?!^)(?=[0-3]\\d\\.\\d{2}\\.\\d{2}, \\d{2}:\\d{2})", perl = TRUE)) # 查看结果 print(Cut)
正则说明
(?!^):负向预查,匹配不是字符串起始位置的位置,避免在开头分割出空字符或截断首字符。(?=[0-3]\\d\\.\\d{2}\\.\\d{2}, \\d{2}:\\d{2}):正向预查,精准定位后面跟着日.月.年, 时:分格式的位置,这里用\\d代替[0-9]更简洁,\\.用来匹配字面意义的点号(和[.]效果一致)。
效果验证
运行上述代码后,你会得到期望的结果:每个元素都是完整的带日期时间标记的消息,比如第一个元素是:
"05.10.17, 09:26 - Person One: How about we chill on sunday\n"
内容的提问来源于stack exchange,提问作者Ju Ko
相关产品推荐
相关产品推荐

