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)
只检查两个强制性的.
...是的我懂...
相信我,我试过了.没有其他任何东西给出了期望的结果,但允许通过没有强制性字符的字符串等.
有谁知道如何更简单/更优雅的方式?
奖金问题:有一件事我上面的正则表达不太合适(不止一个,但这个问题最让我烦恼):
据我所知(?)正则表达式,(?\\|)?应该意味着该字符|是否被包含(除非我非常错误),仍然在上面的设置中它似乎强制执行该字符.这当然适合我的目的,但我不明白为什么它的工作方式.
因此,如果有人可以解释,我在那里缺少什么,那将是非常好的,此外,我怀疑这是一个更简单的解决方案的关键(检查一个正则表达式中的强制和可选字符将是理想的.
感谢大家通过我的问题阅读(和痛苦),甚至更感谢那些回复的人.:)
我确实尝试了类似的东西^[\\|\\-(?:\\:)?)]$,但这不会强制执行所有强制性字符.
使用基于前瞻性的正则表达式.
^(?=.*\\|)(?=.*-)[-:|]+$
Run Code Online (Sandbox Code Playgroud)
要么
^(?=.*\\|)[-:|]*-[-:|]*$
Run Code Online (Sandbox Code Playgroud)
要么
^[-:|]*(?:-:*\\||\\|:*-)[-:|]*$
Run Code Online (Sandbox Code Playgroud)
(?=.*\\|) 期待至少一个管道.(?=.*-) 期待至少一个连字符.[-:|]+ 列表中的任何字符一次或多次.$ 队伍的尽头.| 归档时间: |
|
| 查看次数: |
1551 次 |
| 最近记录: |