2015-06-20 51 views
1

想知道如何驗證一個字符串,如前3連續數字不能連續8或9?例如:正則表達式來檢查前3個連續數字

88839182 (not valid) 
99923213 (not valid) 
98188823 (valid) 
98939117 (valid) 

使用s.match("([98]){3}")嘗試,但它似乎沒有工作,因爲它需要在989的第3個字符了。

回答

3

您可以使用下面的正則表達式識別連續3個8或9:

"(?:([98])\1\1)" 

Demo

並匹配你願意,你可以提前使用負看數字來匹配沒有按號碼「T之前通過連續3 9或8:

^(?!(?:([98])\1\1)).*$ 

Demo

另外,作爲一個很好的建議,由@ Luv2code您可以使用正則表達式之後,將被迫您正則表達式引擎匹配的數字:

(?=^\d+$)(?!([98])\1\1)\d+ 
+0

嗨!感謝您的回覆。我只想要前3個連續的數字。後續的連續數字被認爲是有效的 –

+0

@ahgal歡迎!檢查編輯! – Kasramvd

+0

@卡斯拉,很好的解決方案。我會指出,如果要求只捕獲數字(這不是特定的,但是基於示例如何解釋需求​​),那將是一個不同的正則表達式。您的正則表達式將匹配123abc,foo,「hello world」等。要將其限制爲僅數字:「(?=^\ d + $)(?!([98])\ 1 \ 1)\ d +」第一個斷言確保整個字段都是數字。第二個主張是你的。最後,我使用了\ d而不是點,所以如果你想123中的「123 z」改變^和$到\ b和瞧! – Luv2code

0

我會假設你的問題說法正確的是:你想(一)發現(b)如果這是888或999,則拒絕該字符串。因此,分兩步進行:

  1. 查找並提取前三個連續數字。
  2. 拒絕的字符串,如果比賽是888或999

匹配三個連續數字的正則表達式僅僅是(\d)\1\1。其餘依賴於你的編程語言(你沒有指定);它幾乎肯定是一種返回數字字符串中第一個匹配內容的方法。

0

另外,定義問題是 「不與888或999開始」 的更簡單的方法,

它找到無效數據:

s.match("^(999|888)") 

要找到有效數據;數據;

!s.match("^(999|888)") 
+0

儘管如此,匹配* do *以'888'或'999'開始的字符串。 – Joey

+0

@joey是的 - 這就是OP的代碼所做的(他抱怨它*也匹配989 ...) – Bohemian

+0

啊,夠公平的;我錯過了那部分。只是這些問題通常源於基於正則表達式的驗證,您所能做的只是提供* valid *值的正則表達式,因此不能編寫任何代碼來反演結果,在這種情況下,必須使用負面預測來解決。 – Joey