Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式不匹配_Regex_Perl - Fatal编程技术网

Regex Perl正则表达式不匹配

Regex Perl正则表达式不匹配,regex,perl,Regex,Perl,我有以下Perl正则表达式 if ($line =~ m/DX/o) { printf("%s.\n", $line); } if ($line =~ m/.*DX\s+.*\s+.*\s+(.*)\sGB/oi) { printf("TRUE: %s\n", $1); ($dx = $1) =~s/,//g; } 它正在印刷 DX93132 GB--2145 GB 16840176 16835553. 但是没有进入第二个正

我有以下Perl正则表达式

if ($line =~ m/DX/o) {
  printf("%s.\n", $line);
}

if ($line =~ m/.*DX\s+.*\s+.*\s+(.*)\sGB/oi) {
                printf("TRUE: %s\n", $1);
                ($dx = $1) =~s/,//g;
}
它正在印刷

DX93132 GB--2145 GB 16840176 16835553.

但是没有进入第二个正则表达式。我已经检查了正则表达式,没有看到任何错误。有人能给我建议吗


谢谢。

以下方法应该有效:
/-\s+(\s+)\s/
试试这个:

^\s*DX.*?([\d,]+)\sGB(?!.*GB)/oi

如果所有字段都由多个空格分隔(即,任何字段都不能在一行中包含两个或多个空格),我建议使用
split
而不是正则表达式:

if ($line =~ /^DX/) {
    my @fields = split /\s{2,}/, $line;
    $fields[3] =~ s/,//g; # Strip commas from 4th field
    print $fields[3];
}

__END__
2145 GB
如果您的数据实际上是以制表符分隔的,请将
split
更改为

my @fields = split /\t/, $line;

如果您的字段都由多个空格分隔,则可以考虑使用<代码>拆分< /代码>而不是正则表达式。无论如何,您的正则表达式被破坏:因为<代码> ./COD>匹配任何字符,<代码> */COD>贪婪,它将尽可能多地吞并,包括空白分隔符。但是,这并不妨碍匹配,它只会影响捕获的内容
$1
。当我在你的字符串上测试正则表达式时,它实际上与我匹配。我假设这是多个空间(例如,
DX
93132之间有19个空格…
?我仍然需要使用正则表达式来检查行是否以DX开头。我们无法复制此问题。向我们显示
use Data::Dumper;$Data::Dumper::Useqq=1;print Dumper$line;
的输出,以便我们确切地知道其中的内容$line@AkshaiShah您没有检查此代码中的行以DX开头。这样的检查将包括行定位的
^
开头:
/^DX/
。它不会检查行是否以DX开头
/DX[^-]+-\s+(\s)\s/
,但仍然不会检查行是否以DX开头。