我正在尝试用Java编写一种方法来检查字符串,并允许它仅包含数字和逗号。此外,不能有重复数字。

例如:

11,22,33-没关系

22,22,33-这不行

我已经使用正则表达式和Set(如下)的组合来完成了它的初稿,但是正在寻找更好的方法,最好仅使用正则表达式。

public boolean isStringOk(String codes) {
if(codes.matches("^[0-9,]+$")){
Set nonRepeatingCodes = new LinkedHashSet();
for(String c: codigoRoletas.split(",")){
if(nonRepeatingCodes.contains(c)){
return false;
}
else{
nonRepeatingCodes.add(c);
}
}
return true;
}
return false;
}

有人知道仅使用正则表达式是否有可能吗?

参考方案

我怀疑这样做是否明智(正如Jarrod Roberson所述),因为您项目中的任何其他编码人员都很难理解。但是,仅使用正则表达式绝对有可能:

^(?:(\d+)(?!.*,\1(?!\d)),)*\d+$

双重负向的前瞻使其难以理解。但这是一个解释:

^ # anchor the regex to the beginning of the string
(?: # subpattern that matches all numbers, but the last one and all commas
(\d+) # capturing group \1, a full number
(?! # negative lookahead, that asserts that this number does not occur again
.* # consume as much as you want, to look through the whole string
, # match a comma
\1 # match the number we have already found
(?!\d) # make sure that the number has ended (so we don't get false negatives)
) # end of lookahead
, # match the comma
)* # end of subpattern, repeat 0 or more times
\d+ # match the last number
$ # anchor the regex to the beginning of the string

请注意,这里只是通用的正则表达式,而不是特定于Java的。在Java中,您需要转义每个反斜杠,否则它将无法通过正则表达式引擎:

^(?:(\\d+)(?!.*,\\1(?!\\d)),)*\\d+$

正则表达式-集团价值替代 - java

我不确定是否可以这样做,但是一旦完成匹配,我需要一种方法来用在运行时动态声明的字符串替换我的regex表达式中指定的编号组的值。举一个简单的例子,类似...(/)?([A-Za-z0-9])?(/)?$ 我希望能够为第2组插入替换项。我目前正在使用Java的Matcher类。 参考方案 是的,那是可行的。查看我对this question的回答,以了解如何。…Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…java split regex-字符的任意组合 - java

我正在使用3个字符分割字符串:空格,破折号和逗号我想要的是能够使用这3个字符的任意组合进行拆分,例如:-,(破折号后跟逗号)或,--(逗号后加2破折号)或- , -(破折号,逗号间隔破折号)等 String address = "Sector -18B, Dwarka"; String[] addressParts = address.s…java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…