2016-11-06 95 views
2

我试图防止重复点字符'。'并且仅允许数字/字母如何防止使用Java正则表达式重复字符

例如

"blah...blah".matches(rex)) //false 
"..blablah".matches(rex)) //false 
"blablah..".matches(rex)) //false 
"blab.lah".matches(rex)) //true 
"bla.blah".matches(rex)) //true 

我试着使用: ^(?!\.\.)([a-zA-Z0-9._\-]*)$ 但它仅适用于第二个例子,我怎样才能使它发挥作用?

+0

你必须使用正则表达式吗? (可能有一个更简单的选项) – ItamarG3

+0

你工作过吗? – ItamarG3

+1

是的,我更喜欢正则表达式 – Canttouchit

回答

2

你非常接近,你需要调整前瞻到(?!.*\\.{2}),所以整体正则表达式是^(?!.*\\.{2})([a-zA-Z0-9._\-]*)$。请注意,与.matches()一起使用时,您不需要锚点,因为它会尝试匹配整个字符串。

如果您不想让任何非字母/数字连续重复,您可以改为使用(?!.*([._-])\\1+)作为loalkahed。

+0

你确定这个工作正常吗?我在http://www.regexplanet.com/advanced/java/index.html上测试过它,但一切都是真实的。 – zygimantus

+0

反斜杠可能吗?在我的回答中,反斜杠(如它们在用作java字符串时需要这样),但该站点需要它们未转义:'^(?!。* \。{2})([a-zA-Z0-9._ \ - ] *)$' –

+0

是的,我错过了。谢谢。 – zygimantus

0

使用String.replace()删除所有'.'字符。

String a="blah...blah"; 
a = a.replace(".", ""); 
System.out.println(a); 

的这个输出是blahblah

2

使用反向引用到拍摄的人物:

if (str.matches("(([\\w.-])(?!\\2))*")) 
    // no chars are repeated 

live demo

请注意,“字母,数字,下划线,点和短划线”可写为[\\w.-]
\w == [a-zA-Z0-9_]如果首先出现或最后出现,则破折号不需要转义。

+0

你的例子非常接近我问,但它检测到所有重复, 让我更具体,我只想防止点(。)字符重复,它可以出现多次,但不是顺序。 我允许所有a-zA-Z0-9和 - (短划线)_(下划线)\(反斜杠)和。(点但不是按顺序)。 我问这是因为我想防止路径遍历。 – Canttouchit

+0

我写了反斜杠我的意思是经常斜杠 – Canttouchit