如何使用正则表达式检查字符串中的重复字符?

时间:2015-03-27 20:03:18

标签: java regex

我正在使用Java编写一个琐事游戏,除了验证用户的一部分答案外,我已经完成了所有工作。所以基本上,我会提示用户提出问题和可能的答案,用户将输入他们的答案。现在,我正在尝试验证他们的答案,然后我检查它是否正确,所以如果它是错误的,我可以提示他们输入不同的答案。规则是他们的答案必须是一个从零到四个字符的字符串,只使用数字1-4,并且不能重复字符。所以1234有效,24有效,321有效,589无效,abc无效,111无效,1233无效。到目前为止,除了重复的字符外,我已经涵盖了所有条件。起初我用了

if (answer.matches("^[1-4]{0,4}$")) { // valid check if correct

除了重复之外,它还可以处理所有事情。接下来我试了

if (answer.matches("^1?2?3?4?$")) { // valid check if correct

如果用户按升序输入数字,即123,234,24,12,2344等,则处理重复项。唯一的问题是如果用户输入类似432的内容,则将被视为无效即使它应该被视为有效。我明白为什么它与我的正则表达式不匹配,但我能想到的唯一其他解决方案是列出所有可能的解决方案,但显然我不会在我的if语句中放入24个条件。我可以用正则表达式做些什么来解决这个问题吗?我知道我可以用蛮力的方式做到这一点,但我更倾向于拥有一个有效的正则表达式来解决这个问题。感谢。

2 个答案:

答案 0 :(得分:1)

你可以使用这个基于loookahead的正则表达式:

\b(?:([1-4])(?![1-4]*\1)){1,4}\b

RegEx Demo

答案 1 :(得分:0)

使用前瞻断言不重复数字:

^(?!.*([1-4]).*\1)[1-4]{0,4}$