Perl中的通用正则表达式,用于以下文本

时间:2016-06-02 06:55:22

标签: regex perl

我需要将以下文本与Perl中的正则表达式匹配。

PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00

我写的表达是:

(\w+)\-(\w+)\-(\w+)\-(\w+)\-(\w+)\-(\w+)

但我想要更通用的东西。通用我的意思是我想在其中包含任意数量的连字符(-)。

也许在正则表达式中有if - then之类的东西,即如果存在某些字符,那么寻找其他东西。有人可以帮帮我吗?

有关我的问题的更多信息:

AB-ab
abc-mno-xyz
lmi-jlk-mno-xyz









。 !

我希望匹配所有模式..更准确地说我的字符串(随意使用\ w因为我可以在这里使用大写,小写,数字和'_'underscore。)可以被视为一组任意数字用连字符(' - ')作为分隔符的字母数字子串

2 个答案:

答案 0 :(得分:1)

您正在寻找带有quatifiers的正则表达式(参见perldoc perlre - Section Quantifiers)。

您有几种可能性:

    如果通过连字符(/\w+(?:-\w+)+)/)链接,则
  • \w将匹配任意两组-个字符。例如,AB-CD将匹配。请注意,\w您匹配大写和小写字母,因此您还会将pre-owned之类的字词作为关键字匹配。

  • /\w+(?:-\w+){5})/会将密钥与6个组匹配。它等同于你拥有的那个

  • /\w+(?:-\w+){5,})/会匹配6组或更多组的密钥。

如果文档中有多个键,则可以使用/g选项在正则表达式中执行隐式循环。

#!/usr/bin/env perl
use strict;
use warnings;
use feature qw{say};
use Data::Dumper;    

my $text = "some text here PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00 some text there";

my @matches = $text =~ /\w+(?:-\w+)+)/g;

print Dumper(\@matches);

结果:

$VAR1 = [
          'PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00'
        ];

答案 1 :(得分:0)

如何使用split:

my $str = 'PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00';
my @elem = split(/-/, $str);

根据评论进行编辑:

#!/usr/bin/perl
use Data::Dumper;
use Modern::Perl;

my $str = 'Text before PS3XAY3N5SZ4K-XX_5C9F-S801-F04BN01K-00000-00 text after';
my ($str2) = $str =~  /(\w+(?:-\w+)+)/;
my @elem = split(/-/, $str2);
say Dumper\@elem;

<强>输出:

$VAR1 = [
          'PS3XAY3N5SZ4K',
          'XX_5C9F',
          'S801',
          'F04BN01K',
          '00000',
          '00'
        ];