【问题标题】:Regex extract characters depending on string length正则表达式根据字符串长度提取字符
【发布时间】:2013-06-04 18:34:35
【问题描述】:

我想提取英国邮政编码的外码。所有背景都在这里:UK Postcode Regex (Comprehensive)

但这不是验证,所以应该这样做:

  • 长度为 5 的邮政编码的前 2 个字符
  • 长度为 6 的邮政编码的前 3 个字符
  • 长度为 7 的邮政编码的前 4 个字符

所有邮政编码都转换为大写且没有空格。

我不知道如何指定动态范围。或者任何可行的方法。

伪代码^[A-Z0-9]{length(postcode) - 3}

补充:我正在使用 R。

【问题讨论】:

    标签: regex string r postal-code


    【解决方案1】:

    您使用的语言或环境(或者更确切地说是正则表达式风格)会有所帮助(在任何正则表达式问题中总是如此),但在大多数情况下应该这样做:

    ^([A-Z0-9]{2,})[A-Z0-9]{3}$
    

    所以我们匹配 capture1 中的 2 个或更多字符,然后正好需要 3 个字符,直到字符串的末尾。您访问捕获的方式取决于您的环境。

    如果您的正则表达式支持lookaheads,您也可以不使用捕获:

    ^[A-Z0-9]{2,}(?=[A-Z0-9]{3}$)
    

    这保证了匹配的结尾后面跟着三个字符和字符串的结尾,但不包括这部分在匹配中。

    【讨论】:

    • @Rico 这就是我的表达方式。第一个捕获组1 中的输出码,而第二个只返回输出码作为匹配项。在 R 中,您可能需要使用 PCRE 正则表达式来使用后者。看看here,了解如何让第一个选项在 R 中工作。
    • 你知道如何从第一个选项中提取 R 中的第 1 组吗?第二个似乎不适用于stringrpackage。
    • @Rico 抱歉,我没有任何 R。但请查看我最后评论中的链接。我想用[1,2]? 来索引结果
    • 是的,我已经很接近了,但从一个优雅的解决方案来看还不够。 rs[, (c("post1.len", "outcode")) := as.data.frame(str_match(lender.postcode, "^([A-Z0-9]{2,})[A-Z0-9]{3}$"), stringsAsFactors=FALSE)] 工作。
    猜你喜欢
    • 2014-10-22
    • 2014-08-25
    • 2018-07-11
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多