【问题标题】:Get error result when search match for only one time搜索只匹配一次时得到错误结果
【发布时间】:2019-10-30 20:15:09
【问题描述】:

我想搜索一个与另一个字符串中的确切时间匹配的字符串,但遇到了一些问题。

use strict;
use warnings;

my $test="abc1234abc5678abcdef910";
my $cut_seq="abc";

print $test,"\tone time\n" if($test=~/$cut_seq{1}/);

print $test,"\tmore than one times\n" if($test=~/$cut_seq{1,}/);

我期待结果:

abc1234abc5678abcdef910 more than one times

但结果显示为:

abc1234abc5678abcdef910 one time
abc1234abc5678abcdef910 more than one times

我也试过这个:

print $test,"\tone time\n" if($test=~/$cut_seq{0,1}/);
print $test,"\tone time\n" if($test=~/$cut_seq{1,1}/);
print $test,"\tmore than one times\n" if($test=~/$cut_seq{1,}/);

但没有任何改变。我只是想知道为什么它不能匹配确切的时间。如果某事物匹配两次,它也会匹配一次,那么 {1}、{1,}、{1,1}、{1,2} 有什么区别。我不明白创建这些不同的形式。

【问题讨论】:

  • 仅供参考:{1,} 的意思不是“超过一次”而是“一次或多次”
  • @TOto,我很抱歉这个错误。

标签: regex perl match


【解决方案1】:

如果某件事匹配了两次,它也匹配了一次。这就是为什么你的“一次性”比赛总是开始的原因。

我认为,最简单的方法是简单地在您的 $cut_seq 处拆分并检查拆分元素的数量。

my $test="abc1234abc5678abcdef910";
my $cut_seq="abc";
my @elts= split /$cut_seq/, $test;
print scalar(@elts)-1," times\n";

附:这不包括字符串末尾的 '$cut_seq' - 抱歉!您必须附加一些不属于您的序列的内容,例如:

my $test="abc1234abc5678abcdef910";
my $cut_seq="abc";
my @elts= split /$cut_seq/, $test . chr(0);
print scalar(@elts)-1," times\n";

【讨论】:

  • 非常感谢。您的解决方案可能是一种更简单的方法。我只是想知道为什么它不能匹配确切的时间。如果某项匹配两次,它也会匹配一次,那么{1}, {1,}, {1,2} 有什么区别。我不明白创建这些不同的表单的意义。
  • /a{2,3}/ 将匹配所有aaaaaaaaa 等等。但它不会匹配ababa{…} 部分表示重复前面的“原子”。所以你的$cut_seqabc/$cut_seq{2,3}/xabcxabcxabcx 中根本不匹配。它只会匹配例如xabcabcabcx
猜你喜欢
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2021-12-01
相关资源
最近更新 更多