如何解决字符串匹配和提取
| 我有一个类似\“ ab.cde.fg.hi \”的字符串,我想将其拆分为两个字符串。 \“ ab.cde.fg \” \“。hi \” 怎么做?我写了一些代码,可以得到第二个字符串,但是如何检索其余的字符串呢?$mystring = \"ab.cde.fg\";
$mystring =~ m/.*(\\..+)/;
print \"$1\\n\";
解决方法
my ($first,$second) = $string =~ /(.*)(\\..*)/;
您也可以使用split
:
my ($first,$second) = split /(?=\\.[^.]+$)/,$string;
,确定要不要...
($name,$path,$suffix) = File::Basename::fileparse($fullname,@suffixlist);
,my @parts = /(.*)\\.(.*)/s;
my @parts = split /\\.(?!.*\\.)/s;
my @parts = split /\\.(?=[^.]*\\z)/s;
更新:我看错了。 \“。\”应该包含在第二部分中,但不在上面。以上应为:
my @parts = /(.*)(\\..*)/s;
my @parts = split /(?=\\.(?!.*\\.))/s;
my @parts = split /(?=\\.[^.]*\\z)/s;
,为了推广我的想法,使用rindex获得
1) \"ab.cde.fg\"
2) \".hi\"
从\"ab.cde.fg.hi\"
起,我编写了这个脚本来简化实验:
use strict;
use diagnostics;
use warnings;
use English;
my @tests = (
[ \'ab.cde.fg.hi\',\'ab.cde.fg|.hi\' ],[ \'abxcdexfg.hi\',\'abxcdexfg|.hi\' ]
);
for my $test (@tests) {
my $src = $test->[0];
my $exp = $test->[1];
printf \"-----|%s| ==> |%s|-----\\n\",$src,$exp;
for my $op (
[ \'ikegami 1\',sub { shift =~ /(.*)\\.(.*)/s; } ],[ \'ikegami 2\',sub { split( /\\.(?!.*\\.\\z)/s,shift) } ],[ \'rindex\',sub { my $p = rindex( $_[0],\'.\' );
( substr($_[0],$p),substr($_[0],$p)
); }
]
) {
my ($head,$tail) = $op->[1]( $src );
my $res = join \'|\',($head,$tail);
my $ok = $exp eq $res ? \'ok\' : \"fail: $exp expected.\";
printf \"%12s: %-20s => %-20s : %s\\n\",$op->[0],$res,$ok;
}
}
输出:
-----|ab.cde.fg.hi| ==> |ab.cde.fg|.hi|-----
ikegami 1: ab.cde.fg.hi => ab.cde.fg|hi : fail: ab.cde.fg|.hi expected.
ikegami 2: ab.cde.fg.hi => ab|cde : fail: ab.cde.fg|.hi expected.
rindex: ab.cde.fg.hi => ab.cde.fg|.hi : ok
-----|abxcdexfg.hi| ==> |abxcdexfg|.hi|-----
ikegami 1: abxcdexfg.hi => abxcdexfg|hi : fail: abxcdexfg|.hi expected.
ikegami 2: abxcdexfg.hi => abxcdexfg|hi : fail: abxcdexfg|.hi expected.
rindex: abxcdexfg.hi => abxcdexfg|.hi : ok
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。