Stata 正则表达式

Stata regular expressions

我需要使用正则表达式来提取字符串变量的一部分。我的数据看起来像这样 a 代表字母字符 xZ 代表数字字符。我想提取“-”之前的 Z 个字符

   var1
    "aaa xxx xxx ZZZ-ZZZ-a"
    "aaa xx xxx ZZZ-ZZ"

我的代码是这样的

gen p_id = regexs(1) if regexm(var1, "([0-9][0-9][0-9])[-]*[0-9][0-9][-]*[ a-zA-Z]*$")

此代码提取的内容超出了要求。例如,此代码从如下所示的观察中提取数字部分。具体来说,它提取 ZZZ

var1
"aaa ZZZZZ aaa"

我尝试了各种表达式,但无法得到所需的答案。

我认为您需要更好地描述可以存在的值的结构。但 怎么样:

clear
set more off

input ///
str30 x
"aaa 736 058 123-456-a"
"aaa 11 688 789-01"
"aaa 56789 aaa"
end

// original
gen p_id = regexs(1) ///
    if regexm(x, "([0-9][0-9][0-9])[-]*[0-9][0-9][-]*[ a-zA-Z]*$")

// modified
gen p_id2 = regexs(1) ///
    if regexm(x, "([0-9]*[-][0-9]*)")

list p_id*

?

这似乎经常发生,提前决定解决方案必须基于正则表达式只会使您的代码复杂化。根据您的描述,您需要第一个“-”之前的三个字符。那将是

 gen p_id = substr(var1, strpos(var1, "-") - 3, 3) 

测试示例:

 clear 

 input str21 var1
 "aaa xxx xxx 123-ZZZ-a"
 "aaa xx xxx 567-ZZ"
 end 

 gen p_id = substr(var1, strpos(var1, "-") - 3, 3) 

 list 

     +------------------------------+
     |                  var1   p_id |
     |------------------------------|
  1. | aaa xxx xxx 123-ZZZ-a    123 |
  2. |     aaa xx xxx 567-ZZ    567 |
     +------------------------------+

尝试

gen  var2=regexs(1) if regexm(var1,"([0-9]+)[-]*([0-9]+)[-]*([0-9]+)[-]?([a-z]*$

继续将 regexs(1) 更改为 regexs(2) 和 regexs(3) 以及变量名称以在 (-)

之前生成其他数字