使用preg_match捕获字符串中的组

费德里科

我在解析codeigniter中的文本文件时遇到麻烦,对于文件中的每一行,我都需要捕获组数据...数据包括:-渐进编号-运算符-制造商-模型-注册-类型

这是文件行的示例

 8  SIRIO S.P.A.                                             BOMBARDIER INC.                                       BD-100-1A10             I-FORZ              STANDARD

 9  ESERCENTE PRIVATO                                        PIAGGIO AERO INDUSTRIES S.P.A.                        P.180 AVANTI II         I-FXRJ              SPECIALE/STANDARD

10  MIGNINI & PETRINI S.P.A.                                 ROBINSON HELICOPTER COMPANY                           R44 II                  I-HIKE              SPECIALE/STANDARD

11  MIGNINI & PETRINI S.P.A.                                 ROBINSON HELICOPTER COMPANY                           R44 II                  I-HIKE              STANDARD

12  BLUE PANORAMA AIRLINES S.P.A.                            THE BOEING COMPANY                                    737-86N                 I-LCFC              STANDARD

为了解析每一行,我使用以下代码:

if ($fh = fopen($filePath, 'r')) {
    while (!feof($fh)) {
        $line = trim(fgets($fh));

        if(preg_match('/^(\d{1,})\s+(\w{1,})\s+(\w{1,})\s+(\w{1,})\s+(\w{1,})\s+(\w{1,})$/i', $line, $matches))
       {
             $regs[] = array(
             'Operator'     => $matches[1],
             'Manufacturer' => $matches[2],
             'Model'        => $matches[3],
             'Registration' => $matches[4],
             'Type'         => $matches[5]
             );
             $this->data['error'] = FALSE;
        }
    }
    fclose($fh);
 }

上面的代码不起作用...我认为是因为某些数据组由一个以上的单词组成...例如“ SIRIO SPA”,是否有任何提示可以解决此问题?非常感谢您的帮助

西尔瓦娜斯

你不应该使用\w用于捕捉数据的某些字符在文本一样&.-/是不是单词字符的一部分。此外,其中一些字符之间\w{1,}空格隔开,因此您应该替换掉它们,以\S+(?: \S+)*将您的文本正确地捕获到已组成的组中。

尝试将您的正则表达式更改为此,它应该可以工作,

^\s*(\d+)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)\s+(\S+(?: \S+)*)$

检查这个演示

什么解释\S+(?: \S+)*在上述正则表达式一样。

  • \S+-含义\S相反,\s它匹配任何非空白字符(不匹配空格或制表符或换行符或垂直空间或水平空间,通常不匹配任何空白)字符。因此\S+匹配一个或多个可见字符
  • (?: \S+)*-这?:仅适用于将一个组转换为非捕获组,并且在其后面有一个空格,\S+并且所有这些都用量词括在括号中*因此,这意味着匹配一个空格,后跟一个或多个非空白字符,并*使用量词将其整体零次或多次

因此\S+(?: \S+)将匹配abcabc xyzabc pqr xyz等等,但是一旦出现一个以上的空格,该匹配就会停止,因为正则表达式中之前只有一个空格\S+

希望我的解释清楚。如有任何疑问,请随时提出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章