我需要将以下文本与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。)可以被视为一组任意数字用连字符(' - ')作为分隔符的字母数字子串
答案 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'
];