我遇到了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
}
第一个正则表达式
"^[(?\\:)?\\|\\-]*(([\\|\\-][(?:\\:)?])|([(?:\\:)?][\\|\\-]))[(?\\:)?\\|\\-]*$"
检查所有三个字符
下一个
"^[(?\\|)?\\-]*(([\\-][(?:\\|)?])|([(?:\\|)?][\\-]))[(?\\|)?\\-]*$"
仅检查两个强制性的。
...是的,我知道......
但请相信我,我试过了。没有其他任何东西给出了期望的结果,但允许通过字符串而没有强制性字符等。
有谁知道如何以更简单/更优雅的方式做到这一点?
奖金问题 :有一件事我不太了解上面的正则表达式(不止一个,但这个问题最让我烦恼):
据我所知(?)正则表达式,(?\\|)?
应该表示字符|
是否包含(除非我非常错误),仍然在上面设置似乎强制执行该角色。这当然适合我的目的,但我不明白为什么它的工作方式。
因此,如果有人能够解释,我在那里失踪了什么,那真的很棒,此外,我怀疑这是一个更简单的解决方案的关键(在一个正则表达式中检查强制和可选字符)会是理想的。
感谢大家通过我的问题阅读(和痛苦),甚至更感谢那些回复的人。 :)
我确实尝过^[\\|\\-(?:\\:)?)]$
之类的内容,但这不会强制执行所有必填字符。
答案 0 :(得分:8)
使用基于前瞻性的正则表达式。
^(?=.*\\|)(?=.*-)[-:|]+$
或
^(?=.*\\|)[-:|]*-[-:|]*$
或
^[-:|]*(?:-:*\\||\\|:*-)[-:|]*$
DEMO 1 {
{3}}
(?=.*\\|)
期待至少一个烟斗。(?=.*-)
期待至少一个连字符。[-:|]+
列表中的任何字符一次或多次。$
行尾。答案 1 :(得分:1)
这是一个简单的答案:
(?=.*\|.*-|.*-.*\|)^([-|:]+)$
这表示字符串需要有一个' - '然后是' |'或者' |'接下来是' - ',通过前瞻。然后该字符串仅匹配允许的字符。
答案 2 :(得分:0)
这是一个没有前瞻和背后的人。
^[-:|]*\\|[-:|]*-[-:|]*|[-:|]*-[-:|]*\\|[-:|]*$
这不会缩放,因此Avinash的解决方案是首选 - 如果你的正则表达式系统具有外观*。