2012-05-02 39 views
0

我需要编写一个Perl正则表达式来匹配包含字母和数字的单词中的数字。 例如:test123。我想写数量只有部分匹配的正则表达式和捕捉它用字母和数字匹配字符串中的数字

我想这\S*(\d+)\S*,它仅捕获3而不是123

+0

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

回答

-1

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

+1

他说他想要捕捉数字。 –

+0

@SinanÜnür,是的,他确实这么说。但他也表示,他只是成功地夺取了“123”数字中的一个数字而不是整个“123”。我相信这是由于他如何使用括号。 – Marc

+0

不,请参阅其他答案;他/他失去了数字\ S * – ysth

1

你的正则表达式中的*是贪婪的,这就是为什么他们“吃”的数字。正是@Marc所说的,你不需要它们。

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

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

1

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

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

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

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

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

所有你需要的是:

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

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

1

是它是在需要可非数字(比如之前,按照您的例子)的情况下,你可以使用下面的非贪婪表达式:

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

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

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

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

相关问题