如何使用正则表达式在Stata中实现非贪婪匹配?或者Stata甚至拥有这种能力?
我想提取标签之间出现的所有文字"#"和一段时间"。"。
示例代码:
clear
set obs 3
generate var1="anything#aaabbbccc.dddeee.fff" in 1
replace var1="anything#aaabbbccc.dddeee" in 2
replace var1="anything#aaabbbccc." in 3
generate var2=regexs(1) if regexm(var1,"#(.*)\.")
list
但在Stata(第13.1节)中,我似乎无法使用非贪婪的角色#(.*?)\.
。因此,上面的代码给出了:
+--------------------------------------------------+
| var1 var2 |
|--------------------------------------------------|
| anything#aaabbbccc.dddeee.fff aaabbbccc.dddeee |
| anything#aaabbbccc.dddeee aaabbbccc |
| anything#aaabbbccc. aaabbbccc |
+--------------------------------------------------+
但我想要的是:
+--------------------------------------------------+
| var1 var2 |
|--------------------------------------------------|
| anything#aaabbbccc.dddeee.fff aaabbbccc |
| anything#aaabbbccc.dddeee aaabbbccc |
| anything#aaabbbccc. aaabbbccc |
+--------------------------------------------------+
答案 0 :(得分:4)
使用#(.*?)\.
的一个游戏就是匹配在哈希符号后出现的任何非点字符,即此模式:
#([^.]*)
试试这段代码:
clear
set obs 3
generate var1="anything#aaabbbccc.dddeee.fff" in 1
replace var1="anything#aaabbbccc.dddeee" in 2
replace var1="anything#aaabbbccc." in 3
generate var2=regexs(1) if regexm(var1,"#([^.]*)")
list
答案 1 :(得分:0)
一旦许多程序员学会了正则表达式,他们就不愿意在字符串管理中寻找其他地方,并且有充分的理由。
这只是要指出,对于给出的问题以及其他许多问题,还有一个行人选择:
clear
set obs 3
generate var1="anything#aaabbbccc.dddeee.fff" in 1
replace var1="anything#aaabbbccc.dddeee" in 2
replace var1="anything#aaabbbccc." in 3
generate var2=regexs(1) if regexm(var1,"#([^.]*)")
gen where1 = strpos(var1, "#") + 1
gen where2 = strpos(var1, ".")
gen var3 = substr(var1, where1, where2 - where1)
list
+-------------------------------------------------------------------------+
| var1 var2 where1 where2 var3 |
|-------------------------------------------------------------------------|
1. | anything#aaabbbccc.dddeee.fff aaabbbccc 10 19 aaabbbccc |
2. | anything#aaabbbccc.dddeee aaabbbccc 10 19 aaabbbccc |
3. | anything#aaabbbccc. aaabbbccc 10 19 aaabbbccc |
+-----------------------------------------------------------------------
找到所需子字符串的开头和结尾的位置,并提取它们之间的位置。这绝对缺乏风格,但有时会让你更快。永远记得在计算出你需要的正则表达式时考虑到程序员的时间。