2012-12-24 267 views
3

我想匹配像「100」,「1.1」,「5.404」這樣的數字,如果它們沒有在前面包括像這樣的字母:「V102」。正則表達式匹配前面沒有字母的數字

這裏是我當前的正則表達式:

(?<![A-Za-z])[0-9.]+ 

據說這是爲了匹配任何字符0-9。一個或多個重複,如果前綴不存在(A-Za-z)。

但是它所做的與V102相匹配,因爲它只是將V和另一個字母切掉,然後其餘部分適合,而實際上它不應該匹配那種情況。我怎樣才能讓它抓住所有數字,然後檢查前綴是否不存在?

+3

你實際上意味着以匹配輸入中_inputs_或令牌?答案高度依賴於此。例如,在「A 922」中,你的意思是匹配「922」還是一無所有? – fge

+0

擺脫反斜槓。 – Barmar

+0

匹配輸入內的令牌,我猜。它可以是一串隨機的東西,它應該匹配在它前面沒有包含字母的所有數字。 – user1594138

回答

7

添加數字和小數點到您的負回顧後:

(?<![A-Za-z0-9.])[0-9.]+ 

這將迫使所有比賽開始一個非數字和非字母(即空格或其他分隔符)。這樣數字的結尾也不會是有效的匹配。

演示:http://www.rubular.com/r/EDuI2D9jnW

+0

This Works thanks ! – user1594138

0

嘗試使用插入符號^運算符。這個操作符表示你希望你的模式從輸入的開始處開始。例如,^[0-9.]+將匹配以數字或.開頭並具有任意數量的輸入。 請注意,此圖案不僅僅與數字相匹配,因爲它也與具有多於1個點的圖案匹配,例如2.00.2,這不是有效的數字。

1

你能否使用單詞界限?

\b[0-9\.]+\b 
+0

這對小數不起作用 – mellamokb

1

嘗試正則表達式:

(?<![A-Za-z0-9])[0-9.]+ 
+0

This Works thanks,mellamokb幾秒前提交了幾乎完全相同的東西。所以我會選擇他。 – user1594138

+2

您在負向lookbehind中也需要小數點,否則它會在'F1.00'中錯誤地匹配'.00'(例如:http://www.rubular.com/r/jGdtWa5k2a) – mellamokb

+0

@mellamokb好點,錯過了。你已經接受了答案。 – Barmar

0

如果你不想字母或空格在字符串中的任何地方,那麼這應該工作:

^[0-9.]+$ 
1

一非正則表達式解決方案。

如果您有以下字符串,那麼您可以使用double.TryParse來查看該字符串是否爲double。嘗試:

string str = "100 1.1 V100 d333 ABC 1.1"; 
double temp; 
string[] result = str.Split().Where(r => (double.TryParse(r, out temp))).ToArray(); 

,或者您需要一個雙陣列中的回報,那麼:

double[] numberArray = str.Split() 
          .Where(r => double.TryParse(r, out temp)) 
          .Select(r => double.Parse(r)) 
          .ToArray(); 
+1

他只說拒絕帶字母前綴的數字。該解決方案將拒絕帶有任何非數字前綴的數字。 – Barmar

相關問題