在找到第一个数字之前,如何找到第一个子字符串?
示例:
my $string = 'AAAA_BBBB_12_13_14' ;
预期结果:'AAAA_BBBB _'
答案 0 :(得分:3)
从您想要使用正则表达式的标签判断。所以让我们建立起来。
^
metacharacter进行锚定\D
+
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_