根据其他字符串变量提取新变量中的字符串模式

时间:2019-08-09 13:53:59

标签: regex stata string-matching

考虑以下变量:

clear

input str18 string
"abc bcd cde"        
"def efg fgh"
"ghi hij ijk"    
end

我可以使用regexm()函数提取所有出现的abccdedef

generate new = regexm(string, "abc|cde|def")

list

|string          new |
|--------------------|
|  abc bcd cde     1 |
|  def efg fgh     1 |
|  ghi hij ijk     0 |

如何获得以下信息?

|string            wanted  |
|--------------------------|
|  abc bcd cde     abc cde |
|  def efg fgh     def     |
|  ghi hij ijk             |

这个问题是在这里回答的一个扩展:

2 个答案:

答案 0 :(得分:3)

我读为您的

  1. 具有允许的单词列表。

  2. 想要在允许的单词中出现的字符串中的单词。

为此类问题寻求理想的正则表达式解决方案是一种时尚,但是您的示例至少会对存在的单词产生简单的循环。但是请注意,inlist()具有广告限制。

clear

input str18 string
"abc bcd cde"        
"def efg fgh"
"ghi hij ijk"    
end

generate wanted = "" 

generate wc = wordcount(string) 
summarize wc, meanonly 

quietly forvalues j = 1/`r(max)' { 
    replace wanted = wanted + " " + word(string, `j') if inlist(word(string, `j'), "abc", "cde", "def")
} 

replace wanted = trim(wanted) 

list 

     +----------------------------+
     |      string    wanted   wc |
     |----------------------------|
  1. | abc bcd cde   abc cde    3 |
  2. | def efg fgh       def    3 |
  3. | ghi hij ijk              3 |
     +----------------------------+

答案 1 :(得分:1)

这是使用正则表达式的解决方案:

clear

input str18 string
"abc bcd cde"        
"def efg fgh"
"ghi hij ijk"    
end

generate wanted = ustrregexra(string, "(\b((?!(abc|cde|def))\w)+\b)", " ")  
replace wanted = strtrim(stritrim(wanted))

list

     +-----------------------+
     |      string    wanted |
     |-----------------------|
  1. | abc bcd cde   abc cde |
  2. | def efg fgh       def |
  3. | ghi hij ijk           |
     +-----------------------+