电脑相关信息:stata版本:stata16MP
PC系统:win10
问题具体描述:
对于ustrregex函数中,用以表示任意字符的.和用以说明前一表达式匹配个数为任意的*合用为(.*)时的一些可能的问题。
数据样式:
变量名: var1
观测值1: {A00002B;?B11111B;?C44444A},B33333E,{B9999R;?A22222D},B44444F,{B3333D;?D4444H}
数据说明:以,作为分隔符,首字母为某项目的大类类别,{}代表某项目可能从属于多个类别,其中不同类别以;?分隔,可以看出该观测值都具有大类B。
处理目的:希望将所有包含比大类B小的大类项目去掉(即将所有{}中包含首字母为A的项目去掉)
问题分析:
由于A只可能出现在{A或者;?A这两个位置,则以此作为识别标志
命令尝试
gen var2 = ustrregexra(var1,"(\{A(.*)\}|\{\(.*)(;\?A)(.*)})","")
命令分析:
要删除的一定在花括号{}中,所以通过转义符\确定\{\},中间除了紧跟在左花括号{的A和原有分隔符;?的A外,存在数字、字母、标点,因此统一用(.*)来描述
发现问题:
可能出现对{A...},B...,{...(该括号中没有A类)}或者{...(该括号中没有A类)},B..,{..;?A..}或者{A...},B...,{..;?A...}这三种情况的误判。即并不能保证只在一对花括号中进行匹配
勉强可行的修改方式:
由于确定所有类别号仅有大写英文和数字组成,可将花括号中的分隔符;?替换为小写字母,然后将表示任意字符的(.*)更改为任意大小写字母和数字的([a-zA-Z0-9]*)
但这种修改法只能用于这种特定的情况(能用小写字母作为花括号中的分隔符)
希望大家解决:
regex中的“非”命令:如何在(.*)中剔除某些特定的字符或字符串组合?
即,如何在\{(.*)\}中保证\}是在\{之后的第一个\}?


雷达卡




京公网安备 11010802022788号







