如果string*only*包含来自字符集的*all*字符加上可选字符集,则匹配正则表达式

Att*_*osz 10 java regex string

我遇到了Java正则表达式的小问题.(我必须提前说,我对Java或正则表达式都不是很有经验.)

我有一个字符串,以及一组三个字符.我想知道字符串是否由这些字符构建.另外(只是为了使它更复杂),两个字符必须在字符串中,而第三个字符是**可选*.

我确实有一个解决方案,我的问题是,如果有人能提供更好/更好/更优雅的东西,因为当我看到它时,这让我哭了...

设置

  • 强制字符有:(|管道)和-(破折号).

    有问题的字符串应该由这些字符串组合而成.它们可以是任何顺序,但两者都必须在其中.

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

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

  • 禁止任何其他角色.

预期成绩

以下字符串应该工作/不工作:

"------" = false
"||||" = false
"---|---" = true
"|||-|||" = true
"--|-|--|---|||-" = true
Run Code Online (Sandbox Code Playgroud)

...和...

"----:|--|:::|---::|" = true
":::------:::---:---" = false
"|||:|:::::|" = false
"--:::---|:|---G---n" = false
Run Code Online (Sandbox Code Playgroud)

...等等.

"丑陋"的解决方案

现在,我有一个似乎有效的解决方案,基于这个stackoverflow答案.当你看到这个时,我想要一个更好的原因将变得明显:

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

    //do funny stuff with a meaningless string

} else {

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

}
Run Code Online (Sandbox Code Playgroud)

打破它

第一个正则表达式

 "^[(?\\:)?\\|\\-]*(([\\|\\-][(?:\\:)?])|([(?:\\:)?][\\|\\-]))[(?\\:)?\\|\\-]*$"
Run Code Online (Sandbox Code Playgroud)

检查所有三个字符

下一个

"^[(?\\|)?\\-]*(([\\-][(?:\\|)?])|([(?:\\|)?][\\-]))[(?\\|)?\\-]*$"
Run Code Online (Sandbox Code Playgroud)

只检查两个强制性的.

...是的我懂...

相信我,我试过了.没有其他任何东西给出了期望的结果,但允许通过没有强制性字符的字符串等.

问题是...

有谁知道如何更简单/更优雅的方式?

奖金问题:有一件事我上面的正则表达不太合适(不止一个,但这个问题最让我烦恼):

据我所知(?)正则表达式,(?\\|)?应该意味着该字符|是否被包含(除非我非常错误),仍然在上面的设置中它似乎强制执行该字符.这当然适合我的目的,但我不明白为什么它的工作方式.

因此,如果有人可以解释,我在那里缺少什么,那将是非常好的,此外,我怀疑这是一个更简单的解决方案的关键(检查一个正则表达式中的强制和可选字符将是理想的.

感谢大家通过我的问题阅读(和痛苦),甚至更感谢那些回复的人.:)

PS

我确实尝试了类似的东西^[\\|\\-(?:\\:)?)]$,但这不会强制执行所有强制性字符.

Avi*_*Raj 8

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

^(?=.*\\|)(?=.*-)[-:|]+$
Run Code Online (Sandbox Code Playgroud)

要么

^(?=.*\\|)[-:|]*-[-:|]*$
Run Code Online (Sandbox Code Playgroud)

要么

^[-:|]*(?:-:*\\||\\|:*-)[-:|]*$
Run Code Online (Sandbox Code Playgroud)

DEMO 1
DEMO 2

  • (?=.*\\|) 期待至少一个管道.
  • (?=.*-) 期待至少一个连字符.
  • [-:|]+ 列表中的任何字符一次或多次.
  • $ 队伍的尽头.

  • 它完美无缺!感谢您的回答,甚至更多的演示链接,它使学习正则表达式更容易!我会阅读更多有关前瞻/后盾的内容,从未对他们过于熟悉.(虽然在今天的经历之后,我不确定我是否每个人都想再次触摸正则表达式,但我的眼睛仍然很痛苦.哭泣的血液并不好玩.) (2认同)