我想知道我怎么能匹配两个数字但是不一样。所以,匹配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 :(得分: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])$
上进行测试
/^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