【问题标题】:Iterating metacharacters for regex in Stata在Stata中迭代正则表达式的元字符
【发布时间】:2015-06-30 20:44:37
【问题描述】:

我目前正在使用正则表达式来处理 Stata 中的街道名称。我遇到了一个问题,需要我根据字符串中某个单词的长度来选择观察结果。我知道您可以在其他引擎中使用弯括号指定表达式的迭代,但这似乎在 Stata 中不起作用。具体来说,我想选择在字符串中的某个点具有三个或更多字母数字字符的观察值,其编码应为

[a-zA-Z0-9]{3,}

但是,当我在 Stata 中尝试时,这不起作用,并且 {} 的任何其他用途也不起作用,即使在线调试器说它应该是正确的。这是Stata执行正则表达式的缺陷吗?我正在研究一个不需要迭代的解决方案,但我想听听社区关于 Stata 中正则表达式的不足,以及是否有不同的方法来迭代程序中的表达式。

【问题讨论】:

  • curved brackets, in a certain point in the string.. 你这是什么意思?您能否提供来自 stata 文档的关于他们使用哪种正则表达式引擎的报价?

标签: regex string stata


【解决方案1】:

我认为 Stata 14 中的新 Unicode 正则表达式解析器(基于 ICU 标准)可以使用这种表示法来查找至少重复 k 次的模式:

clear

input str50 address
"221B Baker Street"
"56B, Whitehaven Mansions"
"Danemead, High street, St. Mary Mead"
end

compress

list address if ustrregexm(address,"([0-9]){3,}")

这只会给你 Sherlock 的地址,因为它有 3 个或更多数字。看起来你也可以使用字符类:

list address if ustrregexm(address,"([:digit:]){3,}")

regular 正则表达式解析器具有never supported 这种快捷方式功能。

【讨论】:

    【解决方案2】:

    根据documentation,Stata 中没有限制量词。

    其他流行的正则表达式语法包括 POSIX 标准和 Perl 标准。两者都对这些基本运算符进行了扩展,包括计数运算符(使用大括号)、元字符(通常为 :alpha: 等形式)以及其他特定于语法的附加内容。

    在选择采用哪个常规表达语法时,STATA有几个选项。不同的操作系统提供自己的正则表达式解析器供应用程序使用,但不能保证这些解析器是一致的。 Stata 使用自己的解析器避免了这种歧义。

    您只需要“手动”重复子模式(如文档网页上的一些示例):

    [a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]+
    

    【讨论】:

    • @sln:我猜作者只是想说 Stata 不需要其他正则表达式的所有功能,尤其是上面列出的那些。
    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多