代码之家  ›  专栏  ›  技术社区  ›  dimitriy

一种用于将一些文本环绕在数字列表成员周围的行

  •  1
  • dimitriy  · 技术社区  · 6 年前

    假设我有一个字符串序列,看起来像这样:

    1 10 46565 5968678 3 567 78
    

    F(1) F(10) F(46565) F(5968678) F(3) F(567) F(78)
    

    有没有一个正则表达式一行程序可以用任意数量的元素在Stata中实现这一点?

    我试过:

    . display ustrregexra("1 10 46565 5968678 3 567 78","([:digit:]){1,}","XXX")
    XXX XXX XXX XXX XXX XXX XXX
    

    . display ustrregexra("1 10 46565 5968678 3 567 78","([:digit:]){1,}","F(&)")
    F(&) F(&) F(&) F(&) F(&) F(&) F(&)
    

    . display ustrregexra("1 10 46565 5968678 3 567 78","[0-9]{1,}","F(&)")
    F(&) F(&) F(&) F(&) F(&) F(&) F(&)
    

    在VI中,这似乎起到了关键作用:

    .s/[0-9]\{1,}/F(&)/g
    

    ICU regex engine 根据 this comment 一个StataCorp的程序员。

    1 回复  |  直到 6 年前
        1
  •  2
  •   user8682794 user8682794    6 年前

    这里有两个问题:

    1. 它的正则表达式函数不能处理替换,例如 F(\1) .

    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"