与正则表达式的协助

时间:2016-02-18 20:39:06

标签: regex match

我只是在获得模式的第n个匹配时遇到问题。 这就是我想要做的事情:

我有以下文字,我试图只获得第三场比赛:

(?:^this.*?one)

我正在使用以下正则表达式来创建一个起始字符串为&#34的细线;这个"并且结束字符串" one"。所以我的正则表达式是:

/*
**  ASCII <=> EBCDIC conversion functions
*/

static unsigned char a2e[256] = {
          0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 37, 11, 12, 13, 14, 15,
         16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
         64, 79,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
        240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
        124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
        215,216,217,226,227,228,229,230,231,232,233, 74,224, 90, 95,109,
        121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
        151,152,153,162,163,164,165,166,167,168,169,192,106,208,161,  7,
         32, 33, 34, 35, 36, 21,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27,
         48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,225,
         65, 66, 67, 68, 69, 70, 71, 72, 73, 81, 82, 83, 84, 85, 86, 87,
         88, 89, 98, 99,100,101,102,103,104,105,112,113,114,115,116,117,
        118,119,120,128,138,139,140,141,142,143,144,154,155,156,157,158,
        159,160,170,171,172,173,174,175,176,177,178,179,180,181,182,183,
        184,185,186,187,188,189,190,191,202,203,204,205,206,207,218,219,
        220,221,222,223,234,235,236,237,238,239,250,251,252,253,254,255
};

static unsigned char e2a[256] = {
          0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15,
         16, 17, 18, 19,157,133,  8,135, 24, 25,146,143, 28, 29, 30, 31,
        128,129,130,131,132, 10, 23, 27,136,137,138,139,140,  5,  6,  7,
        144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26,
         32,160,161,162,163,164,165,166,167,168, 91, 46, 60, 40, 43, 33,
         38,169,170,171,172,173,174,175,176,177, 93, 36, 42, 41, 59, 94,
         45, 47,178,179,180,181,182,183,184,185,124, 44, 37, 95, 62, 63,
        186,187,188,189,190,191,192,193,194, 96, 58, 35, 64, 39, 61, 34,
        195, 97, 98, 99,100,101,102,103,104,105,196,197,198,199,200,201,
        202,106,107,108,109,110,111,112,113,114,203,204,205,206,207,208,
        209,126,115,116,117,118,119,120,121,122,210,211,212,213,214,215,
        216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,
        123, 65, 66, 67, 68, 69, 70, 71, 72, 73,232,233,234,235,236,237,
        125, 74, 75, 76, 77, 78, 79, 80, 81, 82,238,239,240,241,242,243,
         92,159, 83, 84, 85, 86, 87, 88, 89, 90,244,245,246,247,248,249,
         48, 49, 50, 51, 52, 53, 54, 55, 56, 57,250,251,252,253,254,255
};

char ASCIItoEBCDIC(const unsigned char c)
{
        return a2e[c];
}

char EBCDICtoASCII(const unsigned char c)
{
        return e2a[c];
}

使用RegEx Tester v3.2.0.0,我能够获得匹配的行。这些行是1,2,3和5.第4行是忽略的,因为它显然不匹配。

现在我只对换取第3行感兴趣并忽略其他比赛。所以我认为通过使用出现{nth}并将其附加到我的正则表达式的末尾,我将获得第3场比赛。它似乎不起作用。我不知道该怎么做,我希望有人可以提供帮助。任何帮助表示赞赏。谢谢!

更新1
如果我的问题令人困惑,我很抱歉。我只对创建一个只返回第3行匹配的模式感兴趣。
我开始研究一种模式,找到所有匹配起始和结束字符串的行,所以我想出了(?:^ this。*?one)。
我开始在线阅读试图找出我是否也可以在正则表达式中指定只给出模式的第3个匹配。我开始阅读有关事件的内容,我想我可以使用它来指定第n次出现的模式。也许我并不完全理解如何使用事件。这就是我寻求帮助的原因。

2 个答案:

答案 0 :(得分:1)

如果您总是需要获得第三行,请尝试以下方法:

/(?:^this.*one\r?\n){2}^(this.*one$)/gm

Online Demo

  • (?:是一个非捕获组,换句话说,不能$1
  • 一样使用它
  • ^匹配行的开头
  • .*one匹配所有内容,直至one字,然后\r?\n表示新行
  • {2}它限制匹配以仅选择两条第一行
  • ^第三行的开头
  • (捕获组,换句话说,您可以通过$1
  • 获取此捕获组的值
  • this.*one符合此模式:this{anything}one
  • $匹配行尾
BTW,正如@ wiktor-stribiżew在评论中提到的,这可能是一个较短的版本:

/(?:(^this.*one)\r?\n){3}/gm

Online Demo

此外,如果你需要抓住评论部分(//之后的内容),那么试试这个:(但我觉得你不需要这个)

/(?:^this.*one\r?\n){2}^(this.*one(:?\s*\/\/\s*.*$))/gm

Online Demo

答案 1 :(得分:0)

根据您的使用情况,您可以将其更改为捕获组并添加全局和多行选项,然后获取第三组($ 3或您的具体案例使用的任何内容)。

这个给你所有的比赛,如果你想要nth,那么抓住第n组。

/(^this.*?one)/mg

Example