首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Perl重用正则表达式的部分

Perl重用正则表达式的部分
EN

Stack Overflow用户
提问于 2017-05-04 15:09:39
回答 2查看 230关注 0票数 0

我正试图用perl编写一个正则表达式来匹配这一行。

代码语言:javascript
运行
复制
    PTTO/ETTO/PROO State  NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA       NA     

Here "PTTO/ETTO/PROO State " is constant and line must start with that after that there could be PO,EO,PRO followed by whitespace. Then the same pattern of any one of PO,EO,PRO followed by whitespace repeats.

我试着用这个正则表达式来匹配这一行,它匹配

代码语言:javascript
运行
复制
PTTO/ETTO/PROO State  NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+NA|PO|EO|PRO\s+

但它与下面的正则表达式不匹配。

代码语言:javascript
运行
复制
PTTO/ETTO/PROO State  (NA|PO|EO|PRO\s+){14}

有人能解释一下我哪里出了问题吗?

提前谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-04 15:32:27

您的正则表达式是不正确的,这是:

代码语言:javascript
运行
复制
(NA|PO|EO|PRO\s+){14}

允许NAPOEOPRO +一个或多个空白,14次(https://regex101.com/r/rEc16C/3)。不过,你想要的是:

代码语言:javascript
运行
复制
((?:NA|PO|EO|PRO)\s+){14}

它允许NAPOEOPRO,以及一个或多个空格14次(https://regex101.com/r/rEc16C/2)。

票数 1
EN

Stack Overflow用户

发布于 2017-05-04 15:22:57

好吧,简单的回答是-我不会试图用正则表达式来做这件事。

代码语言:javascript
运行
复制
#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

while (<>) {

   next unless m{^PTTO/ETTO/PROO State};
   my ( undef, undef, @stuff ) = split;
   print Dumper \@stuff;

   my @invalid = grep { not m/^(?:NA|PO|EO|PRO)$/ } @stuff;
   if (@invalid) {
      print "Invalid values: @invalid\n";
   }
   else {
      print "Line matches\n";
   }
}

这样,首先将行拆分为字段,然后根据正则表达式分别检查每个字段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43786693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档