Perl,正则表达式,恰好匹配2个空格不起作用

时间:2015-04-01 15:14:01

标签: regex perl

处理STA / SSTA时序报告的解析器。可能出现以下“到达时间”情况:

  Arrival Time                3373.000
- Arrival Time                          638.700 | 100.404
                             Arrival Time Report                           

目标是匹配第1和第2个案例,但忽略第3个案例。

我在Perl代码中尝试了两种匹配的模式:

1)if (m/^-?\s{1,2}Arrival\sTime/) { ($STA_DATA{$file}{$path}{Arrival_Time}) = m/\sArrival\sTime\s+(.*)\s+$/ }

2)if (m/^-\sArrival\sTime/ || m/^\s{1,2}Arrival\sTime/) { ($STA_DATA{$file}{$path}{Arrival_Time}) = m/\sArrival\sTime\s+(.*)\s+$/ }

他们两人也接受了第三种情况。我不懂为什么。 我特别定义了一个或两个空格字符\s{1,2},仅此而已。由于第3行包含两个以上的空白字符,因此它不应与模式匹配。这怎么可能?

5 个答案:

答案 0 :(得分:1)

您可以尝试以下可能的解决方法:

if (m/^-?\s{1,2}Arrival\sTime\s{2,}/) { ($STA_DATA{$file}{$path}{Arrival_Time}) = m/\sArrival\sTime\s+(.*)\s+$/ }

您可以将字符串“到达时间”与其后的两个或多个空格匹配,排除字符串“到达时间报告”

答案 1 :(得分:1)

您发布的数据与您在测试中使用的数据不同。

此程序检查正则表达式模式的与直接从原始帖子的编辑复制的数据。这两种模式都不匹配数据中的任何行

use strict;
use warnings;
use 5.010;

my (%STA_DATA, $file, $path);

while ( <DATA> ) {

    if ( /^-?\s{1,2}Arrival\sTime/ )  {
        say 'match1';
        $STA_DATA{$file}{$path}{Arrival_Time} = m/\sArrival\sTime\s+(.*)\s+$/
    }

    if ( /^-\sArrival\sTime/ or m/^\s{1,2}Arrival\sTime/ ) {
        say 'match2';
        $STA_DATA{$file}{$path}{Arrival_Time} = m/\sArrival\sTime\s+(.*)\s+$/
    }
}

__DATA__
      Arrival Time                3373.000
    - Arrival Time                          638.700 | 100.404
                                 Arrival Time Report                           

答案 2 :(得分:0)

你能确认你的正则表达式是在一个循环读取输入的循环内吗?

如果$_包含整个文本,您的观察结果将是预期的,因为您使用$将提取正则表达式锚定到文本的末尾。

答案 3 :(得分:0)

使用通常用于使用可见字符表示空格的Unicode U + 2423 OPEN BOX 来替换数据中的空格应该会有所帮助。

␣␣␣␣␣␣Arrival␣Time␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣3373.000
␣␣␣␣-␣Arrival␣Time␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣638.700␣|␣100.404
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣Arrival␣Time␣Report␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣

答案 4 :(得分:0)

正如鲍罗丁正确地要求的那样,为了学习别人,我要解释我所做的错误并展示解决方案。

我所犯的错误如下:

我错误地认为我的匹配模式正在文本中应用,如.rpt文件中所示。 在这样的文件中可能出现的三种情况(与我的匹配模式相关)如下:

  Arrival Time                3373.000
- Arrival Time                          638.700 | 100.404
                             Arrival Time Report                           

但是,我忘记了代码中的某个地方我已经实现了以下几行:

s/->//g; s/\s\S+\s[v\^]\s//g; s/\s+/ /g;

这是此系列替换中的最后一个替换,将原始文本更改为:

 Arrival Time 3373.000
- Arrival Time 638.700 | 100.404
 Arrival Time Report 

我的匹配模式(在上面的问题中显示)不起作用。

知道这一点,解决方案很简单。我调整了匹配模式如下:

if (m/^\-?\sArrival\sTime\s\d+/) { ($STA_DATA{$file}{$path}{Arrival_Time}) = m/\sArrival\sTime\s(.*)\s?$/ }

我感谢所有的帮助和反馈,我真的很抱歉浪费每个人的时间来处理这个定义不明确的问题。