如何提取第一个数字的子字符串?

时间:2012-03-23 15:20:38

标签: regex perl

在找到第一个数字之前,如何找到第一个子字符串?

示例:

my $string = 'AAAA_BBBB_12_13_14' ;

预期结果:'AAAA_BBBB _'

4 个答案:

答案 0 :(得分:3)

从您想要使用正则表达式的标签判断。所以让我们建立起来。

  • 我们希望从字符串的开头匹配,因此我们在开头使用a ^ metacharacter进行锚定
  • 我们希望匹配除数字之外的任何内容,因此我们look at the character classes并发现这是\D
  • 我们需要其中的一个或多个,所以我们use the + quantifier表示模式的前一部分中的一个或多个。

这给了我们以下正则表达式:

^\D+

我们可以在代码中使用:

my $string = 'AAAA_BBBB_12_13_14';
$string =~ /^\D+/;
my $result = $&;

答案 1 :(得分:2)

大多数人的答案都是正确的,但他们错过了几个关键点。

  • 成功匹配后,您只能信任匹配变量。除非你知道你的比赛成功,否则不要使用它们。

  • $&$``, and $'`在您的计划中的所有正则表达式中都有众所周知的性能惩罚。

  • 您需要将匹配锚定到字符串的开头。由于Perl现在具有用户可设置的默认匹配标志,因此您希望远离线锚的^开头。即使使用默认标志,字符串锚点的\A开头也不会改变它的作用。

这样可行:

my $substring = $string =~ m/\A(\D+)/ ? $1 : undef;

如果您真的想使用$&之类的内容,请使用Perl 5.10匹配的匹配版本。 /p开关提供非全局性能吸引版本:

my $substring = $string =~ m/\A\D+/p ? ${^MATCH} : undef;

如果您担心\D中可能存在的内容,您可以自己指定字符类,而不是使用快捷方式:

my $substring = $string =~ m/\A[^0-9]+/p ? ${^MATCH} : undef;

我不是特别喜欢这里的条件运算符,所以我可能会在列表上下文中使用匹配:

my( $substring ) = $string =~ m/\A([^0-9]+)/;

如果字符串中必须有一个数字(所以,你不匹配没有数字的整个字符串,你可以投入一个前瞻,它不会成为捕获的一部分:< / p>

my( $substring ) = $string =~ m/\A([^0-9]+)(?=[0-9])/;

答案 2 :(得分:0)

  $str =~ /(\d)/; print $`;

此代码打印字符串,位于匹配

之前

答案 3 :(得分:0)

perl -le '$string=q(AAAA_BBBB_12_13_14);$string=~m{(\D+)} and print $1'
AAAA_BBBB_