正则表达式查询以提取最后一条匹配数据

时间:2015-05-26 03:58:22

标签: ruby regex

我有一个特定的RegEx问题,仅仅是因为我试图隔离一个项目而不是多个项目。

这是我正在搜索的文字:

"{\"1430156203913\"=>\"ABC\", \"1430156218698\"=>\"DEF\", \"1430156219763\"=>\"GHI\", \"1430156553620\"=>\"JKL", \"1430156793764\"=>\"MNO\", \"1430156799454\"=>\"PQR\"}"

我想要捕获与ABC相关联的密钥以及与GHI相关联的密钥

第一个很容易,我用这个RegEx捕获它:
/\d.*ABC/映射到:"1430156203913\"=>\"ABC
然后,我只需使用/\d/来提取我正在寻找的 1430156203913 键。

第二个是我遇到的困难。

这不起作用:
/\d.*GHI/映射到第一个数字的开头到我的最终字符串(GHI) - >
1430156203913\"=>\"ABC\", \"1430156218698\"=>\"DEF\", \"1430156219763\"=>\"GHI

问题: 如何编辑第二个正则表达式才能捕获 1430156219763

4 个答案:

答案 0 :(得分:1)

\d[^,]*GHI

你可以简单地使用它。参见演示。

https://regex101.com/r/yW3oJ9/3

答案 1 :(得分:1)

要捕获所有键和值,请使用 String#scan

static_assert(foo() == 0, "..");
static_assert(foo() == 1, "..");
static_assert(foo() == 2, "..");

然后获得你想要的任何k / v对,hashify并找到它们。

int main() {

    static constexpr int counter = 0; 
    struct test
    {
        constexpr int foo(){return counter++;}
    };

    test myTest;

    static_assert(myTest.foo() == 0, "failed");
    static_assert(myTest.foo() == 1, "failed");

    return 0;
}

答案 2 :(得分:1)

尝试这个只捕获密钥

\b\d+\b(?=\\"=>\\"GHI)

检查此Demo

注意我在\b附近添加了d+只是为了获得更好的性能

答案 3 :(得分:1)

这是你可以做到的一种方式:

def extract(str, key)
  r = /
      (?<=\")   # match \" in a positive lookbehind
      \d+       # match one or more digits
      (?=       # begin a positive lookahead
        \"=>\"  # match \"=>\"
        #{key}  # match value of key
        \"      # match \" 
      )         # end positive lookahead
      /x

  str[r]
end

extract str, "ABC" #=> "1430156203913" 
extract str, "GHI" #=> "1430156219763"