【问题标题】:Allow special chars but not when there are only special chars允许特殊字符,但当只有特殊字符时不允许
【发布时间】:2020-03-07 05:31:11
【问题描述】:

假设我有这个:

[a-zA-Z0-9., -&:]+

允许使用字母数字字母和一些特殊字符(逗号、点、破折号等)一次或多次。但是现在,我只想在还有字母数字字母时允许那些特殊字符:

a-b, c:好的

.a::好的

,-.:不行

,:不行

我尝试了一些东西,但仍然无法找到一种方法。我该怎么做?

【问题讨论】:

    标签: regex


    【解决方案1】:

    如果您想确保其中至少有一个字母数字字符,您可以使用:

    [a-zA-Z0-9., &:-]*[a-zA-Z0-9][a-zA-Z0-9., &:-]*
    

    这基本上是零个或多个当前模式(稍作修改(a)),然后是一个字母数字,然后是零个或多个当前模式。这保证不匹配,除非字符串包含一个或多个字母数字。


    如果您使用允许部分匹配的正则表达式函数,您可能还需要考虑将^$ 标记放在模式的末尾。没有它,您可以匹配 <some-invalid-character>A 之类的内容。如果您使用的是“完全匹配”功能,则此可能不是必需的。


    (a) 根据另一个答案中的 cmets,修改是将 - 移动到正则表达式的末尾,以将其视为文字连字符而不是字符范围。

    【讨论】:

    • 感谢您的回答。它同样很好地解决了这个问题,但我会接受另一个答案,因为它还向我介绍了“正则表达式环视”。是的,我正在使用与完整字符串匹配的 Java String#matches,感谢您指出前导和尾随标记。
    【解决方案2】:

    我会在这里使用替代:

    ^(?=.*[A-Za-z0-9])[a-zA-Z0-9., &:-]+$
    

    这个正则表达式读起来很接近你的要求,并且说要匹配:

    ^                      from the start of the string
        (?=.*[A-Za-z0-9])  assert that at least one alphanumeric character be present
        [a-zA-Z0-9., &:-]+  if so, then match either alphas or certain symbols
    $                      end of the string
    

    Demo

    旁注:请注意,在您的原始字符类中,您在中间某处放置了破折号:

    [a-zA-Z0-9., -&:]+
    

    这实际上在空格字符和&之间定义了一个范围的字符;连字符是 not 被包括在内。您可以在我的正则表达式中看到我已将破折号移至类的末尾,以确保将其作为文字包含在内。

    【讨论】:

    • 感谢您指出连字符问题。我认为^((?=.*[A-Za-z0-9])[a-zA-Z0-9., &:-]+)$ 应该足够了吗?
    • 谢谢。我实际上根本不知道“正则表达式环视”,难怪我很难弄清楚这一点。会接受你的回答。谢谢。
    • ...或^(?![., &:-]*$)[a-zA-Z0-9., &:-]+$, (?![., &:-]*$) 是一个负前瞻(仅字符串中的特殊字符)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2010-12-10
    相关资源
    最近更新 更多