SPSS多筛选语法中如何排除特定字符串匹配案例?
调整SPSS字符串筛选逻辑的解决方案
针对你的需求,我们需要修改原语法,实现「保留含HAT但排除仅含CHAT的行;若同时含CHAT和HOT/CAT则保留」的逻辑,以下提供两种可行方法:
方法一:使用基础CHAR函数(兼容所有SPSS版本)
直接通过字符定位函数组合逻辑,语法如下:
COMPUTE keyword = 0 . IF ( // 保留含独立HAT的行(HAT不是CHAT的一部分) (CHAR.INDEX(column1,'HAT') > 0 AND (CHAR.INDEX(column1, 'CHAT') = 0 OR CHAR.INDEX(column1, 'HAT') <> CHAR.INDEX(column1, 'CHAT') + 1 OR CHAR.LENGTH(column1) > CHAR.INDEX(column1, 'CHAT') + 3)) // 保留含HOT的行 OR CHAR.INDEX(column1, 'HOT') > 0 // 保留含CAT的行 OR CHAR.INDEX(column1, 'CAT') > 0 // 保留同时含CHAT和HOT/CAT的行 OR (CHAR.INDEX(column1, 'CHAT') > 0 AND (CHAR.INDEX(column1, 'HOT') > 0 OR CHAR.INDEX(column1, 'CAT') > 0)) ) keyword = 1 . EXECUTE.
逻辑说明:
- 第一部分判断:如果单元格里有HAT,且要么没有CHAT,要么HAT的位置不在CHAT的第2位(即不是CHAT里的HAT),要么单元格长度超过CHAT的位置+3(避免刚好是CHAT的情况)
- 后三部分直接保留原需求里的HOT、CAT,以及同时含CHAT和HOT/CAT的行
方法二:使用正则表达式(SPSS 24及以上版本支持)
用正则更简洁地匹配符合条件的字符串,语法如下:
COMPUTE keyword = 0 . IF ( RX.FIND(column1, '(^HAT|(?<!C)HAT)|HOT|CAT|CHAT.*(HOT|CAT)|(HOT|CAT).*CHAT') > 0 ) keyword = 1 . EXECUTE.
正则规则说明:
(^HAT|(?<!C)HAT):匹配开头就是HAT,或者HAT前面不是字母C的情况(即独立的HAT)HOT|CAT:直接匹配这两个关键词CHAT.*(HOT|CAT)|(HOT|CAT).*CHAT:匹配CHAT和HOT/CAT同时出现的情况(不管顺序)
测试验证:
- 保留:
I LIKE MY HAT(匹配独立HAT)、MY CAT HAS A HAT(匹配CAT+HAT)、I CHAT AND LOVE HOT(匹配CHAT+HOT) - 排除:
I LIKE TO CHAT(仅含CHAT,无其他关键词)
内容的提问来源于stack exchange,提问作者James Camien McGuiggan
相关产品推荐
相关产品推荐

