我希望将一个字符串中的单词的第一个字母与另一个字母相匹配。在这个例子中,字母H:
25HB matches to HC
我正在使用如下所示的匹配运算符:
my ($match) = ( $value =~ m/^d(\w)/ );
与数字不匹配,但第一个匹配的单词字符。我怎么能纠正这个?
答案 0 :(得分:1)
正则表达式不符合你的想法:
m/^d(\w)/
匹配“行首” - 字母d
,然后是单个word character
。
您可能需要:
m/^\d+(\w)/
然后从行首开始匹配一个或多个数字,然后抓取第一个word character
。
E.g:
my $string = '25HC';
my ( $match ) =( $string =~ m/^\d+(\w)/ );
print $match,"\n";
打印H
答案 1 :(得分:1)
您可以尝试^.*?([A-Za-z])
。
以下代码返回:
ITEM: 22hb
MATCH: h
ITEM: 33HB
MATCH: H
ITEM: 3333
MATCH:
ITEM: 43 H
MATCH: H
ITEM: HB33
MATCH: H
脚本。
#!/usr/bin/perl
my @array = ('22hb','33HB','3333','43 H','HB33');
for my $item (@array) {
my $match = $1 if $item =~ /^.*?([A-Za-z])/;
print "ITEM: $item \nMATCH: $match\n\n";
}
答案 2 :(得分:1)
你不清楚你想要什么。如果要将字符串中的第一个字母与字符串中的相同字母匹配:
m{
( # start a capture
[[:alpha:]] # match a single letter
) # end of capture
.*? # skip minimum number of any character
\1 # match the captured letter
}msx; # /m means multilines, /s means . matches newlines, /x means ignore whitespace in pattern
有关详细信息,请参阅perldoc perlre。
<强>附录:强>
如果用词来表示任何字母数字序列,这可能更接近你想要的:
m{
\b # match a word boundary (start or end of a word)
\d* # greedy match any digits
( # start a capture
[[:alpha:]] # match a single letter
) # end of capture
.*? # skip minimum number of any character
\b # match a word boundary (start or end of a word)
\d* # greedy match any digits
\1 # match the captured letter
}msx; # /m means multilines, /s means . matches newlines, /x means ignore whitespace in pattern
答案 3 :(得分:0)
我相信这就是你要找的东西:
(如果您能提供更清晰的例子,我们可以帮助您更好)
以下代码采用两个字符串,并在两个字符串中找到第一个非数字字符:
my $string1 = '25HB';
my $string2 = 'HC';
#strip all digits
$string1 =~ s/\d//g;
foreach my $alpha (split //, $string1) {
# for each non-digit check if we find a match
if ($string2 =~ /$alpha/) {
print "First matching non-numeric character: $alpha\n";
exit;
}
}