正则表达式匹配两个不相等的数字

时间:2011-03-10 09:28:34

标签: regex

我想知道我怎么能匹配两个数字但是不一样。所以,匹配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})$  

谢谢大家!

5 个答案:

答案 0 :(得分:4)

使用此:

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

答案 1 :(得分:3)

您需要使用backreferences。基本上,您需要首先匹配第一个数字([1-6]),存储此匹配(使用一对括号),然后使用此引用来匹配除({1)以外的任何内容}}),字母([^\1])和0,7,8和9:

A-Za-z

答案 2 :(得分: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

答案 3 :(得分: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])$

这当然没有考虑到不允许的重复号码问题,但其他人已经解决了这个问题。

答案 4 :(得分:1)

我认为你需要学习反向引用。它允许您查看先前匹配的组和当前匹配的组是否相同。您可以获得有关它的更多信息here