0

我有一个正则表达式如下:

$regex = qr/(?sx-im:(?sx-im:(?:^|(?<=\n)))(?=(?sx-im:[\ \t]*)(?sx-im:(?:^|(?<=\n))Data\ and\ value)(?sx-im:[\ \t\r]*(?:$|\n))))/;

我将其与以下文本进行匹配:

$text ="Data and value";

现在我想获取匹配开始偏移量、匹配结束偏移量和匹配文本。

通常我使用@-,@+$&得到这些如下:

if($text  =~ m/$regex/) 
{
        print "START Offset = ".$-[0];
        print "END Offsset  = ".$+[0];
        print "Matched Text = ".$&;
}

在这种情况下,匹配成功,但我无法获得正确的偏移量和匹配的文本。它只是打印0为比赛开始偏移量和比赛结束偏移量。对于匹配的文本,它的打印为空。

我想了解这个正则表达式的不同组成部分。具体是什么(?sx-im:,以及如何获得匹配的文本

请不要问我这种正则表达式的原因或建议我更改正则表达式。这是一个软件生成的正则表达式。为了提问,我简化了我的问题。

请指导我从哪里开始理解这个正则表达式并获得匹配偏移量。

4

2 回答 2

4

(?: ... )是非捕获组。它不会创建反向引用。

同样,(?= ... )是一个零宽度的前瞻断言。它不包含匹配的字符串到$&.

请参阅扩展模式

于 2012-11-07T13:49:15.560 回答
4

该错误存在于您的正则表达式中,而不是您对匹配偏移量的理解。它匹配字符串开头的零宽度字符串,并正确报告 0 的开始和结束偏移量。

现在为什么它匹配这是另一个好问题。您可以因此拆分正则表达式(未经测试):

qr/(?sx-im:
  (?sx-im:(?:^|(?<=\n)))
  (?=(?sx-im:[\ \t]*)(?sx-im:(?:^|(?<=\n))Data\ and\ value)(?sx-im:[\ \t\r]*(?:$|\n)))
)/x

你可以看到它的两个连续的部分:

  • 第一个匹配行的开头或后面的匹配\n- 即两者都是零宽度。
  • 第二个是一大堆东西的前瞻匹配,但同样是零宽度匹配。

您似乎试图用正则表达式做太多事情,特别是匹配行的开头和结尾。考虑逐行阅读您的源文件并处理单独的行,而不是尝试使用正则表达式完成所有操作。

于 2012-11-07T14:03:23.223 回答