Regex 基于其他字符串变量提取新变量中的字符串模式
考虑以下变量:Regex 基于其他字符串变量提取新变量中的字符串模式,regex,stata,string-matching,Regex,Stata,String Matching,考虑以下变量: clear input str18 string "abc bcd cde" "def efg fgh" "ghi hij ijk" end 我可以使用regexm()函数提取所有出现的abc、cde和def: generate new = regexm(string, "abc|cde|def") list |string new | |--------------------| | abc bcd cde 1 | |
clear
input str18 string
"abc bcd cde"
"def efg fgh"
"ghi hij ijk"
end
我可以使用regexm()
函数提取所有出现的abc
、cde
和def
:
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 |
此问题是此处所回答问题的延伸:
- 有一个允许的单词列表
- 希望字符串中的单词出现在允许的单词中 为这类问题寻求一种奇特的正则表达式解决方案是一种时尚,但您的示例至少会让现有的单词变成一个简单的循环。但是,请注意,
- 我把这当作你的
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 |
+----------------------------+
这是使用正则表达式的解决方案:
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 |
+-----------------------+
术语列在Stata中仅适用于矩阵或表的列。