正则表达式-捕获重复的数字(不是数字) - java

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

例如:

11,22,33-没关系
22,22,33-这不行

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

public boolean isStringOk(String codes) {
    if(codes.matches("^[0-9,]+$")){ 
        Set<String> nonRepeatingCodes = new LinkedHashSet<String>();
        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…