2011-03-10 134 views
3

我想知道如何匹配兩個數字,但不一樣。因此,這將是罰款12場,而不是11正則表達式匹配兩個不相等的數字

什麼我至今是: 我要匹配像「P12」的字符串,然後我把這個表達式做到了:

^P([1-6]{1})([1-6]{1})$ 

但現在我的問題是如何匹配只有像P12或P32的數字不重複的字符串。

任何幫助或指導閱讀材料將不勝感激。

編輯: 謝謝大家的回答,但我在RAD(radsoftware.com.au/regexdesigner)測試了這個 - 我知道,我應該提到這個:/,而且大部分都不起作用那裏。我看到一個用戶發佈的解決方案,但這不再可見,我不知道爲什麼,他是否刪除了它?無論如何:這是什麼工作:

^P([1-6]{1})(?!\1)([1-6]{1})$ 

謝謝大家!

+0

呵呵?你說你想匹配「不一樣」的數字,那麼你說12很酷,11不是;對我來說,12和11看起來就像是「不一樣」的數字 – 2011-03-10 09:34:28

+0

@Elijah,他的意思是12(一個兩個)是兩個不同的數字,而11(一個)是兩個相同的數字。他沒有比較11到12. – 2011-03-10 09:40:15

+0

是啊很酷,我得到它後來:) – 2011-03-10 09:44:39

回答

4

使用此:

^P((1[2-6])|(2[13-6])|(3[124-6])|(4[1-356])|(5[1-46])|(6[1-5]))$ 
+0

+1的正則表達式軟件,但我猜想,OP想要捕獲第一位數字和第二位數字作爲單獨組 – YOU 2011-03-10 11:29:16

+0

這是隻有正確的答案..爲什麼其他答案已經upvoted ?. – 2011-03-10 12:37:02

+0

@Gursel:這是唯一的*普遍*正確的答案。但其他答案將取決於正則表達式引擎支持的功能。 – 2011-03-10 12:38:25

2

試一下這個

^P([1-6])([^\\1\D07-9])$ 

測試在js shell

/^P([1-6])([^\\1\D07-9])$/.test("P12") 
true 
/^P([1-6])([^\\1\D07-9])$/.test("P11") 
false 

其他測試用例

/^P([1-6])([^\\1\D07-9])$/.test("P10") 
false 
/^P([1-6])([^\\1\D07-9])$/.test("P1b") 
false 
/^P([1-6])([^\\1\D07-9])$/.test("P17") 
false 
+0

'js>/P(\ d)[^ \\ 1] /。test(「P1b」)' 'true' – 2011-03-10 09:34:53

+0

@Ignacio, ? – YOU 2011-03-10 09:36:26

+0

更接近。但它仍然讓'0'和'7-9'通過。 – 2011-03-10 09:37:27

1

我認爲你需要學習反向引用。它允許您查看先前匹配的組和目前匹配的組是否相同。你可以得到更多的信息here

+0

還有反向鏈接的thanx。 – Nikola 2011-03-10 10:03:57

3

你需要使用backreferences。實質上,您需要首先匹配第一個數字([1-6]),存儲此匹配(使用一對括號),然後使用此參考來匹配除([^\1]),字母(A-Za-z)和0,7之外的任何內容,8和9:

P([1-6])[^\1A-Za-z0789] 
+1

這也將與例如'P1b'。 – 2011-03-10 09:39:56

+0

你確實很對。我現在改變了它。 – 2011-03-10 09:44:50

+0

感謝您的反向鏈接。 – Nikola 2011-03-10 10:03:31

2

JG是正確的,您想使用此問題的反向引用。因此,既然我們已經有了正確的答案,我只是想讓你目前正則表達式的一個評論:

^P([1-6]{1})([1-6]{1})$

{m,n}手段匹配前面的東西至少m,最多n倍。而{n}的意思恰恰與前面的東西匹配n次。所以當你放[1-6]{1}時,你會說「匹配範圍1-6中的一個數字只有一次」。這是多餘的,你可以簡單地自己說[1-6]。所以你的正則表達式可以簡化爲:

^P([1-6])([1-6])$

這當然是不考慮不允許重複的數量問題,但其他人已經解決了這個問題。

+0

謝謝你,我沒有意識到這一點。 – Nikola 2011-03-10 10:01:23