如何使用 Perl 正则表达式匹配 S10101010 类型的字符串?

How do I match a string of the type S10101010 using a Perl regular expression?

我想匹配以下类型的字符串:

S10101010...

下面的脚本 matches/prints 只是“S10”。我该如何解决?

$in = <STDIN>;

print $in=~/S(10)+/;

您可以使用 (?:)

分组,但不能捕获 10
use warnings;
use strict;

my $in = 'abc S101010 def';
$in =~ /(S(?:10)+)/;
print "\n";

外括号捕获到</code>.</p> <p>打印:</p> <pre><code>S101010

参考perldoc perlre

要检查它是否完全匹配,你需要

/^S(?:10)+\z/

^ 表示字符串的开始。
\z 表示字符串结束。
(?:...) 用于正则表达式中的分组。 ((...) 是捕获)。

如果您从 STDIN 读取,请不要忘记使用 chomp 清除最后的换行符,或者使用 $ 而不是 \z 以允许结尾换行符.


比赛将在 $&.

if ( "S10101010" =~ /^S(?:10)+\z/ ) {
   say $&;  # S10101010
}

您也可以使用捕获。

if ( my ($match) = "S10101010" =~ /^ ( S(?:10)+ ) \z/x ) {
   say $match;  # S10101010
}

(也使用 /x 允许的空格。)

当然,由于您要匹配整个字符串,您也可以只打印输入,如以下完整示例所示:

use 5.014;
use warnings;

defined( my $s = <> )
   or die("Premature EOF\n");

chomp($s);

if ( $s =~ /^S(?:10)+\z/ ) {
   say $s;
} else {
   say "[no match]";
}