Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 一个用于环绕数字列表成员的文本的行_Regex_Unicode_Stata - Fatal编程技术网

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程序员提供的

这里有两个问题:

  • Stata不支持您提到的那种正则表达式
  • 它的正则表达式函数不能处理替换,例如
    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"
    

    这里有两个问题:

  • Stata不支持您提到的那种正则表达式
  • 它的正则表达式函数不能处理替换,例如
    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"