使用正则表达式进行非贪婪(懒惰)匹配?

时间:2017-03-23 01:45:08

标签: regex stata lazy-evaluation greedy regex-greedy

如何使用正则表达式在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 |
+--------------------------------------------------+

2 个答案:

答案 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

Demo

答案 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 |
     +-----------------------------------------------------------------------

找到所需子字符串的开头和结尾的位置,并提取它们之间的位置。这绝对缺乏风格,但有时会让你更快。永远记得在计算出你需要的正则表达式时考虑到程序员的时间。