0

我需要编写一个 Perl 正则表达式来匹配包含字母和数字的单词中的数字。示例: test123。我想写一个只匹配数字部分的正则表达式并捕获它

我正在尝试这个\S*(\d+)\S* ,它只捕获 3 而不是 123。

4

6 回答 6

9

正则表达式原子将尽可能匹配。

最初,第一个\S*匹配“ test123”,但正则表达式引擎必须回溯以允许\d+匹配。结果是:

 +------------------- Matches "test12"
 |    +-------------- Matches "3"
 |    |    +--------- Matches ""
 |    |    |
---  ---  ---
\S* (\d+) \S*

所有你需要的是:

my ($num) = "test123" =~ /(\d+)/;

它将尝试在位置 0 匹配,然后在位置 1,......直到找到一个数字,然后它将匹配尽可能多的数字。

于 2012-05-02T18:09:45.433 回答
1

您的*正则表达式中的 是贪婪的,这就是他们“吃”数字的原因。正如@Marc 所说,您不需要它们。

perl -e '$_ = "qwe123qwe"; s/(\d+)/$numbers=$1/e; print $numbers . "\n";'
于 2012-05-02T18:04:05.337 回答
1

"something122320" =~ /(\d+)/将返回 122320;这可能是你想要做的;)

于 2012-05-02T18:06:41.807 回答
1

\S匹配任何非空白字符,包括数字。你想要\d+

my ($number) = 'test123' =~ /(\d+)/;
于 2012-05-02T18:07:57.977 回答
1

如果是需要非数字的情况(例如before,根据您的示例),您可以使用以下非贪婪表达式:

/\w+?(\d+)/ or /\S+?(\d+)/ 

(第二个更符合您的\S*规范。)

你的表达式满足任何一个或多个数字的条件,这可能就是你想要的。它可以是由空格 ( " 123 ") 包围的一串数字,因为最后一个空格和第一个数字之间的边界满足零个或多个非空格,'3'对于后面的空格和下一个空格之间的边界也是如此。

您可能不需要任何规范,并且捕获字符串中的第一个数字就足够了。但如果不是,最好知道如何指定预期的模式。

于 2012-05-02T19:55:08.200 回答
-1

我认为括号表示捕获组,这正是您不想要的。删除它们。您正在寻找/\d+//[0-9]+/

于 2012-05-02T18:03:12.147 回答