我需要编写一个 Perl 正则表达式来匹配包含字母和数字的单词中的数字。示例: test123
。我想写一个只匹配数字部分的正则表达式并捕获它
我正在尝试这个\S*(\d+)\S*
,它只捕获 3 而不是 123。
正则表达式原子将尽可能匹配。
最初,第一个\S*
匹配“ test123
”,但正则表达式引擎必须回溯以允许\d+
匹配。结果是:
+------------------- Matches "test12"
| +-------------- Matches "3"
| | +--------- Matches ""
| | |
--- --- ---
\S* (\d+) \S*
所有你需要的是:
my ($num) = "test123" =~ /(\d+)/;
它将尝试在位置 0 匹配,然后在位置 1,......直到找到一个数字,然后它将匹配尽可能多的数字。
您的*
正则表达式中的 是贪婪的,这就是他们“吃”数字的原因。正如@Marc 所说,您不需要它们。
perl -e '$_ = "qwe123qwe"; s/(\d+)/$numbers=$1/e; print $numbers . "\n";'
"something122320" =~ /(\d+)/
将返回 122320;这可能是你想要做的;)
\S
匹配任何非空白字符,包括数字。你想要\d+
:
my ($number) = 'test123' =~ /(\d+)/;
如果是需要非数字的情况(例如before,根据您的示例),您可以使用以下非贪婪表达式:
/\w+?(\d+)/ or /\S+?(\d+)/
(第二个更符合您的\S*
规范。)
你的表达式满足任何一个或多个数字的条件,这可能就是你想要的。它可以是由空格 ( " 123 "
) 包围的一串数字,因为最后一个空格和第一个数字之间的边界满足零个或多个非空格,'3'
对于后面的空格和下一个空格之间的边界也是如此。
您可能不需要任何规范,并且捕获字符串中的第一个数字就足够了。但如果不是,最好知道如何指定预期的模式。
我认为括号表示捕获组,这正是您不想要的。删除它们。您正在寻找/\d+/
或/[0-9]+/