Regex 一个用于环绕数字列表成员的文本的行
假设我有一个字符串序列,看起来像这样:Regex 一个用于环绕数字列表成员的文本的行,regex,unicode,stata,Regex,Unicode,Stata,假设我有一个字符串序列,看起来像这样: 1 10 46565 5968678 3 567 78 我想把它变成 F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78) 是否有一个regex-one班轮可以通过任意数量的元素在Stata中实现这一点 我试过: . display ustrregexra("1 10 46565 5968678 3 567 78","([:digit:]){1,}","XXX") XXX XXX XXX XXX XXX XX
1 10 46565 5968678 3 567 78
我想把它变成
F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)
是否有一个regex-one班轮可以通过任意数量的元素在Stata中实现这一点
我试过:
. display ustrregexra("1 10 46565 5968678 3 567 78","([:digit:]){1,}","XXX")
XXX XXX XXX XXX XXX XXX XXX
及
及
在VI中,这似乎起到了作用:
.s/[0-9]\{1,}/F(&)/g
对于unicode或vanilla正则表达式函数,在Stata中是否有任何等价物?Stata的Ustregex*函数基于StataCorp程序员提供的 这里有两个问题:
F(\1)
编辑: 下面是一个概括,它也利用了Robert的技巧:
program define foo, rclass
local string `1'
local string = ustrregexra("`string'","\D"," ")
local string = ustrtrim(itrim("`string'"))
local string = ustrregexra("F("+"`string'"+")"," ", ") F(")
return local old_string `1'
return local new_string `string'
end
foo "1 10 46565 5968678 3 567 78"
return list
macros:
r(new_string) : "F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)"
r(old_string) : "1 10 46565 5968678 3 567 78"
foo "1xcvb10gh46565sdda5968678luiy3f567kl78"
return list
macros:
r(new_string) : "F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)"
r(old_string) : "1xcvb10gh46565sdda5968678luiy3f567kl78"
这里有两个问题:
F(\1)
编辑: 下面是一个概括,它也利用了Robert的技巧:
program define foo, rclass
local string `1'
local string = ustrregexra("`string'","\D"," ")
local string = ustrtrim(itrim("`string'"))
local string = ustrregexra("F("+"`string'"+")"," ", ") F(")
return local old_string `1'
return local new_string `string'
end
foo "1 10 46565 5968678 3 567 78"
return list
macros:
r(new_string) : "F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)"
r(old_string) : "1 10 46565 5968678 3 567 78"
foo "1xcvb10gh46565sdda5968678luiy3f567kl78"
return list
macros:
r(new_string) : "F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)"
r(old_string) : "1xcvb10gh46565sdda5968678luiy3f567kl78"
作为一个通用正则表达式,您可以使用手头的示例执行以下操作:
dissubinstr(“F”(“+”1104656559668678356778“+”),“,”)F(“,”)
@RobertPicard这不是正则表达式。OP特别要求一个正则表达式。好的,这里有一个正则表达式版本:disustrregexra(“F”(“+”11046565596678356778“+”),“,”)F(“)
@RobertPicard这是同样的事情。它可以工作,但不是传统意义上的正则表达式。这是字符串替换。不过这是一个聪明的技巧。作为一个通用正则表达式,你可以使用下面的例子来做s/(\d+)/F(\1)/g
:dis subinstr(“F”(“+”1104656559668678356778“+”)”)F(“,”)@RobertPicard这不是正则表达式。OP特别要求一个正则表达式。好的,这里有一个正则表达式版本:disustrregexra(“F”(“+”11046565596678356778“+”),“,”)F(“)
@RobertPicard这是同样的事情。它可以工作,但不是传统意义上的正则表达式。这是字符串替换。聪明的诀窍。+1我知道这一点,但它需要知道元素的数量,这是我在最初的帖子中不太清楚的。我认为你建议的一个小程序是正确的,我可以在其中编写基数计算。我真的认为新的unicode正则表达式引擎能够处理这个问题。谢谢,我也同意——我总是发现Stata的正则表达式低于标准。我怀疑缺乏详细的文档是一个重要的原因,最后,我决定最好改用Python,而不是猜测Stata的regex引擎的怪癖。我认为创建一个小程序很简单,也是最灵活的方法。Robert聪明的解决方案适合您的用例,但在更复杂的情况下,如字符串1xcvb10gh46565sdda5968678luiy3f567kl78
它无法执行您想要的操作并保留字母。这是因为它依赖于简单的字符串替换(在本例中是空格)。+1我知道这一点,但它需要知道元素的数量,这是我在最初的帖子中不太清楚的。我认为你建议的一个小程序是正确的,我可以在其中编写基数计算。我真的认为新的unicode正则表达式引擎能够处理这个问题。谢谢,我也同意——我总是发现Stata的正则表达式低于标准。我怀疑缺乏详细的文档是一个重要的原因,最后,我决定最好改用Python,而不是猜测Stata的regex引擎的怪癖。我认为创建一个小程序很简单,也是最灵活的方法。Robert聪明的解决方案适合您的用例,但在更复杂的情况下,如字符串1xcvb10gh46565sdda5968678luiy3f567kl78
它无法执行您想要的操作并保留字母。这是因为它依赖于简单的字符串替换(在本例中为空格)。
clear
set obs 1
generate str = "1 10 46565 5968678 3 567 78"
local regex ([0-9]*)[ ]([0-9]*)[ ]([0-9]*)[ ]([0-9]*)[ ]([0-9]*)[ ]([0-9]*)[ ]([0-9]*)
generate new_str = "F(" + regexs(1) + ") " + ///
"F(" + regexs(2) + ") " + ///
"F(" + regexs(3) + ") " + ///
"F(" + regexs(4) + ") " + ///
"F(" + regexs(5) + ") " + ///
"F(" + regexs(6) + ") " + ///
"F(" + regexs(7) + ")" if regexm(str, "`regex'")
. list, abbreviate(10)
+--------------------------------------------------------------------------------+
| str new_str |
|--------------------------------------------------------------------------------|
1. | 1 10 46565 5968678 3 567 78 F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78) |
+--------------------------------------------------------------------------------+
program define foo, rclass
local string `1'
local string = ustrregexra("`string'","\D"," ")
local string = ustrtrim(itrim("`string'"))
local string = ustrregexra("F("+"`string'"+")"," ", ") F(")
return local old_string `1'
return local new_string `string'
end
foo "1 10 46565 5968678 3 567 78"
return list
macros:
r(new_string) : "F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)"
r(old_string) : "1 10 46565 5968678 3 567 78"
foo "1xcvb10gh46565sdda5968678luiy3f567kl78"
return list
macros:
r(new_string) : "F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)"
r(old_string) : "1xcvb10gh46565sdda5968678luiy3f567kl78"