将字符串中的数字与字母和数字匹配

时间:2012-05-02 17:57:38

标签: regex perl

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

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

6 个答案:

答案 0 :(得分:9)

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

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

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

您只需要:

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

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

答案 1 :(得分:1)

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

perl -e '$_ = "qwe123qwe"; s/(\d+)/$numbers=$1/e; print $numbers . "\n";'

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

my ($number) = 'test123' =~ /(\d+)/;

答案 4 :(得分:1)

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

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

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

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

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

答案 5 :(得分:-1)

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