2012-05-02 116 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'和以下空格之間的邊界也是如此。

很有可能您不需要任何規範,並且捕獲字符串中的第一個數字就足夠了。但是,如果不是,那麼知道如何指定預期模式是很好的。

相關問題