用正则表达式捕获组

时间:2014-10-31 09:38:23

标签: regex perl

我使用的代码如下,

代码:

 my $str = 123455;

if ($str =~ m/([a-z]+)|(\d+)/ {
   print "$1\n";
}

我知道它不会打印结果,因为我们应该给2美元。但我希望得到结果,因为它通过更改正则表达式使用相同的代码。

有可能吗?

注意:

请不要提供如下结果,

 my $str = 123455;

if ($str =~ m/(?:[a-z]+)|(\d+)/ {
   print "$1\n";
}

4 个答案:

答案 0 :(得分:3)

您可以将(?| .. )用于alternative capture group numbering

use 5.010; # regex feature available since perl 5.10

my $str = 123455;

if ($str =~ m/(?| ([a-z]+)|(\d+) )/x) {
   print "$1\n";
}

答案 1 :(得分:1)

([a-z]+|\d+)

试试这个。$1。见。演示。

http://regex101.com/r/sZ2wJ5/1

如果您想一次只匹配字母或数字,请添加锚点。

^([a-z]+|\d+)$

((?:[a-z]+)|(?:\d+))

答案 2 :(得分:0)

您可以使用print "$&\n"

$& 包含整个匹配的字符串(换句话说:$ 1或$ 2)。

有关详细信息,请参阅http://perldoc.perl.org/perlre.html; - )

答案 3 :(得分:0)

你是什么意思,你不想改变你的团队结构?您希望您的捕获转到第1组,但您已经赢得了未在第1组中添加数字的内容。您 可以更改您的组结构。
如果您仍希望能够在组2中找到数字,则可以创建子组 - 从左括号开始的组编号。试试

([a-z]+|(\d+))

如果这就是你想要的。