【问题标题】:Regex: Allow minimum alphanumeric, dot and - characters. Asterisk allowed anywhere?正则表达式:允许最少的字母数字、点和 - 字符。任何地方都允许使用星号?
【发布时间】:2017-03-01 12:18:04
【问题描述】:

我的要求是:

  1. 字符串至少应包含 4 个字符(仅限字母数字、 允许点和连字符)。
  2. 除此星号外,任何地方都可以使用(开始、中间或结束)
  3. 不应包含除上述第 1 点和第 2 点之外的任何其他字符。

例如以下是有效字符串:

Ab*08

*.6-*N*

以下是无效字符串:

****AB-*

GH.*

我的正则表达式看起来像:

^(.*?[a-zA-Z0-9.\-]){4,}.*$

我在第 1 点和第 2 点中提到的基本验证正在工作。但是正则表达式允许其他特殊字符,如 和 & 等。如何修改我的正则表达式来实现这一点?

【问题讨论】:

  • . 匹配除换行符以外的任何字符。此外,您的要求也不清楚。请解释为什么这个或那个输入无效。
  • @WiktorStribiżew:正如我在问题中提到的 3 点。我的字符串应包含至少 4 个字符(字母数字、点或连字符)。字符串也可以在任何地方包含星号。除了这些字符之外,它不应包含任何其他字符。为了解释这一点,我举了几个例子。
  • @user613114 我建议您删除星号,然后对结果字符串运行正则表达式检查。这样会简单很多。
  • 我认为 Deltharis 解释了其中的奥秘:计数时不应考虑 *。试试^(?=(?:\**[a-zA-Z0-9.-]){4})[a-zA-Z0-9.*-]+$
  • 我认为正则表达式的核心是:你不能用它们解决所有问题。每次您需要其他人为您创建该正则表达式时;您可能会寻找不理解的解决方案。当您将正则表达式添加到 您的 代码中时,该正则表达式将成为 您的 责任。所以,至少对我来说;每次我想“嗯,我可以用一个正则表达式来做到这一点”;但我真的很难自己建立它;我寻找其他选择;-)

标签: java regex


【解决方案1】:

你可以使用

^(?:[*]*[a-zA-Z0-9.-]){4}[*a-zA-Z0-9.-]*$

它检查 4 个有效字符(可能被 * 包围)并检查整个字符串是否仅包含所需字符。

Obligatory regex 101

注意:regex101 不完全支持 java regex 语法。显示的模式是 PCRE 模式,但使用的所有功能在 java regex 中也可用。

注意2:如果你使用.matches来检查你的输入,你可以省略锚点,因为它已经被锚定了。

【讨论】:

  • 成功了,我向你致敬。但是,尝试匹配星号已被空字符替换的字符串感觉是一种更令人满意(且可读/可维护)的解决方案。
  • 当要测试的字符串中包含超过 4 个字符时,这将失败。
  • @Waxolunist 它正确匹配 ABCDEFG.----****** 所以不确定你在说什么。
  • @SebastianProske:您的正则表达式在这个问题中按预期工作 :) 非常感谢您的宝贵时间!!!
  • @Waxolunist:你能给我们一些示例字符串吗,这个正则表达式不起作用?
【解决方案2】:
^(?:\**[\w\d.-]\**){4,}$

应该这样做。简单一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多