2012-11-12 47 views
19

在正則表達式,我需要知道如何搭配一件事或另一個,或兩者(按順序)。但至少有一件事需要在那裏。在正則表達式匹配一件事或另一個,或兩者

例如,以下正則表達式

/^([0-9]+|\.[0-9]+)$/ 

將匹配

234 

.56 

但不

234.56 

雖然下面的正則表達式

/^([0-9]+)?(\.[0-9]+)?$/ 

將三個以上的字符串匹配,但它也將匹配空字符串,這是我們不想要的。

我需要的東西,將上述所有三個串匹配,而不是空字符串。有沒有簡單的方法來做到這一點?

UPDATE:

兩個安德魯和賈斯汀的下面我提供的簡化例子的工作,但他們沒有(除非我錯了)的,我是希望能解決實際使用的情況下工作,所以我現在應該把它放進去。下面是我使用的實際正則表達式:

/^\s*-?0*(?:[0-9]+|[0-9]{1,3}(?:,[0-9]{3})+)(?:\.[0-9]*)?(\s*|[A-Za-z_]*)*$/ 

這將匹配

45 
45.988 
45,689 
34,569,098,233 
567,900.90 
-9 
-34 banana fries 
0.56 points 

但它不會匹配

.56 

,我需要它這樣做。

+0

什麼語言/正則表達式? –

+0

我正在使用JavaScript。 – rharrington

+0

你的編輯使事情變得複雜,但你仍然可以很簡單地做到這一點,特別是如果你先分割空白。看我的編輯。 –

回答

17

完全通用的方法,因爲正則表達式/^A$//^B$/是:

/^(A|B|AB)$/ 

/^([0-9]+|\.[0-9]+|[0-9]+\.[0-9]+)$/ 

注意其他人使用你的榜樣的結構進行簡化。具體來說,他們(隱含地)將其因子分解,以排除左側和右側的常見因子[0-9]*[0-9]+

這樣做的工作是:

  • 所有在[0-9]+交替結束的元素,所以拉了這一點:/^(|\.|[0-9]+\.)[0-9]+$/
  • 現在,我們在交替的空字符串的可能性,所以重寫它使用?(即使用等價(|a|b) = (a|b)?):/^(\.|[0-9]+\.)?[0-9]+$/
  • 同樣,具有相同後綴的交替(\.此時間):/^((|[0-9]+)\.)?[0-9]+$/
  • 圖案(|a+)相同a*,所以,最後:/^([0-9]*\.)?[0-9]+$/
+0

謝謝。我甚至沒有想到這個蠻力的通用解決方案。 – rharrington

4

是的,你可以匹配所有的這些有這樣的表達:

/^[0-9]*\.?[0-9]+$/ 

注意,它也不會空字符串(你的最後一個條件)相匹配。

4

肯定。你想要可選的量詞,?

/^(?=.)([0-9]+)?(\.[0-9]+)?$/ 

以上是略顯尷尬的看,但我想告訴你,在拋出一些?是你精確的模式。在這個版本中,(?=.)確保它不接受一個空字符串,因爲我已經使兩個條款成爲可選。一個更簡單的版本會是這樣的:

/^\d*\.?\d+$/ 

這滿足您的要求,包括防止空字符串。

注意,有許多方式來表達這一點。有些很長,有些非常簡潔,但是they become more complex depending on what you're trying to allow/disallow

編輯:

如果要匹配這個更大的字符串中,我建議在分裂與/^\d*\.?\d+$/測試結果。否則,你將面臨匹配諸如aaa.123.456.bbb之類的匹配或缺少匹配的風險(相信我,你會的.Java缺乏支持lookbehind的支持確保它有可能打破我能想到的任何模式)。

如果你知道一個事實,你不會得到的字符串就像上面,你可以用字休代替^$錨,但它會變得複雜,因爲有.(空格)之間無字中斷。

/(\b\d+|\B\.)?\d*\b/g 

應該這樣做。它會阻止諸如aaa123.456bbb之類的內容,但它將允許123,456123.456。它將允許aaa.123.456.bbb,但正如我所說,如果要全面處理該問題,則需要兩個步驟。

編輯2:您使用情況

如果你想允許空格開頭,正/負標記,並在最後的話,那些實際上是相當嚴格的規定。這是好事。您只需將它們添加到上述的最簡單的模式:

/^\s*[-+]?\d*\.?\d+[a-z_\s]*$/i 

允許數以千計的羣體大大複雜的事情,我建議你看一看我掛了答案。下面是所得到的圖案:

/^\s*[-+]?(\d+|\d{1,3}(,\d{3})*)?(\.\d+)?\b(\s[a-z_\s]*)?$/i 

\b確保了數字部分以數字結束,之後是至少一個空格。

+0

謝謝!是的,我們需要使用數千個,因爲它是用戶和應用程序之間的一種來回的事情,可能會在輸入字段中設置值。該應用程序將始終在數千個分隔符的輸入框中顯示數字,因此如果用戶重新提交它,我們希望它進行驗證。 – rharrington

0

也許這幫助(給你的總體思路):

(?:((?(digits).^|[A-Za-z]+)|(?<digits>\d+))){1,2} 

此模式匹配字符,數字或數字字符以下而不是數字後面的字符。 該模式匹配aa,aa11和11,但不匹配11aa,aa11aa或空字符串。 不要被「。^」困惑,這意味着「一個字符開始跟隨的字符」,它的目的是防止任何匹配。

被警告,這不適用於所有口味的正則表達式,您的正則表達式版本必須支持(?(named group)true|false)

相關問題