正则表达式匹配if * * *包含字符集中的* all *字符加上可选的

时间:2016-03-22 17:58:47

标签: java regex string

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

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

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

设置

  • 必填字符为:|(管道)和-(短划线)。

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

  • 可选字符为::(冒号)。

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

  • 任何其他字符禁止

预期结果

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

"------" = 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 个答案:

答案 0 :(得分:8)

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

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

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

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

DEMO 1 {
{3}}

  • (?=.*\\|)期待至少一个烟斗。
  • (?=.*-)期待至少一个连字符。
  • [-:|]+列表中的任何字符一次或多次。
  • $行尾。

答案 1 :(得分:1)

这是一个简单的答案:

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

这表示字符串需要有一个' - '然后是' |'或者' |'接下来是' - ',通过前瞻。然后该字符串仅匹配允许的字符。

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

答案 2 :(得分:0)

这是一个没有前瞻和背后的人。

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

这不会缩放,因此Avinash的解决方案是首选 - 如果你的正则表达式系统具有外观*。