有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果字符串*仅*包含字符集中的*所有*字符,再加上一个可选字符,则匹配java正则表达式

我在Java正则表达式方面遇到了一个小问题。(我必须提前说,我对Java或regex都不是很有经验。)

我有一个字符串和一组三个字符。我想知道字符串是否仅由这些字符构成。此外(为了使其更加复杂),字符串中必须包含两个字符,而第三个字符是**可选*

我确实有一个解决办法,我的问题是,是否有人能提供更好/更好/更优雅的东西,因为当我看到它时,这让我流下了热血

设置

  • 必需的字符有:|(管道)和-(破折号)

    所讨论的字符串应该由这些字符串组合而成。它们可以按任何顺序排列,但都必须在其中

  • 可选字符是::(冒号)

    字符串可以包含冒号,但它不必。除上述两个字符外,这是唯一允许的其他字符

  • 禁止使用任何其他字符

预期结果

以下字符串应起作用/不起作用:

"------" = false
"||||" = false
"---|---" = true
"|||-|||" = true
"--|-|--|---|||-" = true

。。。而且

"----:|--|:::|---::|" = true
":::------:::---:---" = false
"|||:|:::::|" = false
"--:::---|:|---G---n" = false

。。。等等

“丑陋”的解决方案

现在,我有了一个基于this stackoverflow answer的解决方案,它似乎是有效的。我想要一个更好的,当你从看到这一切中恢复过来的时候,原因就会变得很明显:

if (string.matches("^[(?\\:)?\\|\\-]*(([\\|\\-][(?:\\:)?])|([(?:\\:)?][\\|\\-]))[(?\\:)?\\|\\-]*$") || string.matches("^[(?\\|)?\\-]*(([\\-][(?:\\|)?])|([(?:\\|)?][\\-]))[(?\\|)?\\-]*$")) {

    //do funny stuff with a meaningless string

} else {

   //don't do funny stuff with a meaningless string

}

分解它

第一个正则表达式

 "^[(?\\:)?\\|\\-]*(([\\|\\-][(?:\\:)?])|([(?:\\:)?][\\|\\-]))[(?\\:)?\\|\\-]*$"

检查所有三个字符

下一个

"^[(?\\|)?\\-]*(([\\-][(?:\\|)?])|([(?:\\|)?][\\-]))[(?\\|)?\\-]*$"

只检查两个必填项

。。。是的,我知道

但相信我,我试过了。除此之外,没有任何内容提供所需的结果,但允许在没有强制字符的情况下通过字符串等

问题是

有人知道如何以更简单/更优雅的方式完成吗

奖金问题:在上面的正则表达式中,有一件事我没有完全理解(不止一件,但这件事最让我讨厌):

据我所知(?)正则表达式(?\\|)?应该意味着字符|要么包含要么不包含(除非我大错特错),在上面的设置中,它似乎仍然强制该字符。这当然符合我的目的,但我不明白为什么它是这样工作的

因此,如果有人能解释一下,我遗漏了什么,那就太好了,此外,我怀疑这是一个更简单的解决方案的关键(在一个正则表达式中检查强制和可选字符将是理想的)

感谢大家阅读(和忍受)我的问题,更感谢那些回答我的人。:)

PS

我确实尝试过像^[\\|\\-(?:\\:)?)]$这样的东西,但这不会强制所有的强制字符


共 (3) 个答案

  1. # 1 楼答案

    使用基于前瞻的正则表达式

    ^(?=.*\\|)(?=.*-)[-:|]+$
    

    ^(?=.*\\|)[-:|]*-[-:|]*$
    

    ^[-:|]*(?:-:*\\||\\|:*-)[-:|]*$
    

    DEMO 1
    DEMO 2

    • (?=.*\\|)至少需要一个管道
    • (?=.*-)至少需要一个连字符
    • [-:|]+列表中的任何字符出现一次或多次
    • $行的末尾
  2. # 2 楼答案

    以下是一个简单的答案:

    (?=.*\|.*-|.*-.*\|)^([-|:]+)$
    

    这表示字符串需要有一个“-”后跟“|”,或者一个“|”后跟一个“-”,通过向前看。那么字符串只与允许的字符匹配

    演示:http://fiddle.re/1hnu96

  3. # 3 楼答案

    这里有一个没有前后看的

     ^[-:|]*\\|[-:|]*-[-:|]*|[-:|]*-[-:|]*\\|[-:|]*$
    

    这无法扩展,因此如果您的正则表达式系统具有lookbe*,则最好使用Avinash的解决方案