Perl中的正则表达式边界不会产生预期的结果

时间:2016-04-05 17:20:29

标签: regex perl

所以我在从两个关键字之间的字符串中提取数据时遇到问题。我知道在正则表达式中我假设使用\ b边界标记并且我已经为测试示例编写了以下内容,但它似乎只匹配整个字符串而不仅仅是我想要的部分。 / p>

例如,字符串:"这里有更多字符串单词START OF INFORMATION SECTION其他一些东西"

我正在" START"之间收集文字。和"部分"。

所以我期待"开始信息部分",我相信。

这是我用Perl专门编写的以下代码段,但它没有产生我预期的结果。

#!/usr/bin/perl

# This is perl 5, version 22, subversion 1 (v5.22.1) built for cygwin-thread-multi
use POSIX;

my $text = "here are more string words START OF INFORMATION SECTION some other stuff";

print "Original String: $text\n";

# this should provide me with the specific text between my two boundary words
$text =~ /\bSTART\b(.*?)\bSECTION\b/;

print "New String: $text\n";

3 个答案:

答案 0 :(得分:1)

您的代码只是测试正则表达式模式是否与字符串匹配,返回true或false值以指示是否存在匹配项。您丢弃该指标

如果匹配,那么使用正则表达式模式中的括号捕获的字符串将被分配给捕获变量$1$2

目前还不清楚您需要做什么,但此程序会在STARTSECTION之间打印所有内容:在这种情况下OF INFORMATION

不需要use POSIX,但use strictuse warnings 'all'是必不可少的

#!/usr/bin/perl

use strict;
use warnings 'all';

my $text = "here are more string words START OF INFORMATION SECTION some other stuff";

print "Original String: $text\n";

if ( $text =~ /\bSTART\b(.*?)\bSECTION\b/ ) {
    my $section = $1;
    print "New String:      $section\n";
}

输出

Original String: here are more string words START OF INFORMATION SECTION some other stuff
New String:       OF INFORMATION 

答案 1 :(得分:0)

你应该使用这个

$text =~ /\b(START\b(.*?)\bSECTION)\b/;
print "New String: $1\n";

<强> IDEONE DEMO

$1是第一个被捕获的群体。

根据 borodin

的建议
if ( $text =~ /\b(START\b(.*?)\bSECTION)\b/ ) {
    my $tmp = $1;
    print "New String:      $tmp\n";
}

答案 2 :(得分:0)

匹配运算符不会更改匹配的字符串。

您可以使用以下任一方法检查捕获的字符串:

if ( $text =~ /\bSTART\b(.*?)\bSECTION\b/ ) {
    my $section = $1;
    print "New String: $section\n";
}

if ( my ($section) = $text =~ /\bSTART\b(.*?)\bSECTION\b/ ) {
    print "New String: $section\n";
}