gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:58 24 4
gpt4 key购买 nike

我遇到了 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

}

分解

第一个正则表达式

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

检查所有三个字符

下一个

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

只检查两个必填项。

...是的,我知道...

但是相信我,我试过了。除了允许通过没有强制字符等的字符串之外,没有其他方法可以给出所需的结果。

问题是...

有谁知道如何以更简单/更优雅的方式做到这一点?

奖励问题:上面的正则表达式中有一点我不太明白(不止一个,但这个最让我烦恼):

据我了解(?)正则表达式,(?\\|)? 应该表示包含或不包含字符 |(除非我我大错特错了),仍然在上面的设置中,它似乎强制执行该字符。这当然符合我的目的,但我不明白为什么它会那样工作。

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

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

附言

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

最佳答案

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

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

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

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

DEMO 1
DEMO 2

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

关于java - 如果字符串 *仅* 包含字符集中的 *所有* 字符,加上一个可选字符,则匹配正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com