【问题标题】:Regex : string must contain a-z and A-Z and 0-9正则表达式:字符串必须包含 a-z 和 A-Z 以及 0-9
【发布时间】:2012-08-05 09:59:00
【问题描述】:

我正在使用存储过程来验证输入参数。输入参数必须包含 a-z 和 A-Z 和 0-9。
例如:
aS78fhE0 -> 正确
76AfbRZt -> 正确
76afbrzt -> 不正确(不包含大写 AZ)
asAfbRZt -> 不正确(不包含'不包含数字 0-9)
4QA53RZJ -> 不正确(不包含小写字母 az)

什么正则表达式可以像上面的例子一样验证输入参数,.?

非常感谢,
Praditha

更新
不允许使用除字母数字以外的其他字符
我正在使用 MySQL 版本 5

【问题讨论】:

  • 是否允许使用任何其他字符?
  • 不,就像上面的示例..

标签: mysql regex stored-procedures


【解决方案1】:

[a-zA-Z0-9]*[az]+[a-zA-Z0-9]*[AZ]+[a-zA-Z0-9]*[0-9]+[a- zA-Z0-9]*|[a-zA-Z0-9]*[az]+[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*[AZ ]+[a-zA-Z0-9]*|[a-zA-Z0-9]*[AZ]+[a-zA-Z0-9]*[az]+[a-zA-Z0-9] *[0-9]+[a-zA-Z0-9]*|[a-zA-Z0-9]*[AZ]+[a-zA-Z0-9]*[0-9]+[a -zA-Z0-9]*[az]+[a-zA-Z0-9]*|[a-zA-Z0-9]*[0-9]+[a-zA-Z0-9]*[ AZ]+[a-zA-Z0-9]*[az]+[a-zA-Z0-9]*|[a-zA-Z0-9]*[0-9]+[a-zA-Z0 -9]*[az]+[a-zA-Z0-9]*[AZ]+[a-zA-Z0-9]*

【讨论】:

  • 这要么允许像"%§&aA0§$%"这样的无效字符串,要么(如果你在它周围添加锚)拒绝像"aA0aA0"这样的有效字符串。
【解决方案2】:

进一步来自 Johns Post 和随后的 cmets:

你需要的 MySql 是

SELECT * FROM mytable WHERE mycolumn REGEXP BINARY '[a-z]'
                        AND mycolumn REGEXP BINARY '[A-Z]'
                        AND mycolumn REGEXP BINARY '[0-9]'

添加额外的

AND mycolum REGEXP BINARY '^[a-zA-Z0-9]+$'

如果您希望字符串中包含字母数字

【讨论】:

  • 我不明白,我只是尝试过这样的 SELECT * FROM tb_m_menu WHERE 'aa11' REGEXP '[A-Z]'; ,但它返回 TRUE。我认为MySQL中的大小写没有区别。
  • 您需要使用二进制字符串使正则表达式区分大小写。
【解决方案3】:

不幸的是,MySQL 不支持环视断言,因此您必须为正则表达式引擎拼出它(假设 只有这些字符是合法的):

^(
[A-Za-z0-9]*[a-z][A-Za-z0-9]*[A-Z][A-Za-z0-9]*[0-9][A-Za-z0-9]*|
[A-Za-z0-9]*[a-z][A-Za-z0-9]*[0-9][A-Za-z0-9]*[A-Z][A-Za-z0-9]*|
[A-Za-z0-9]*[A-Z][A-Za-z0-9]*[a-z][A-Za-z0-9]*[0-9][A-Za-z0-9]*|
[A-Za-z0-9]*[A-Z][A-Za-z0-9]*[0-9][A-Za-z0-9]*[a-z][A-Za-z0-9]*|
[A-Za-z0-9]*[0-9][A-Za-z0-9]*[a-z][A-Za-z0-9]*[A-Z][A-Za-z0-9]*|
[A-Za-z0-9]*[0-9][A-Za-z0-9]*[A-Z][A-Za-z0-9]*[a-z][A-Za-z0-9]*
)$

或者,在 MySQL 中:

SELECT * FROM mytable WHERE mycolumn REGEXP BINARY "^([A-Za-z0-9]*[a-z][A-Za-z0-9]*[A-Z][A-Za-z0-9]*[0-9][A-Za-z0-9]*|[A-Za-z0-9]*[a-z][A-Za-z0-9]*[0-9][A-Za-z0-9]*[A-Z][A-Za-z0-9]*|[A-Za-z0-9]*[A-Z][A-Za-z0-9]*[a-z][A-Za-z0-9]*[0-9][A-Za-z0-9]*|[A-Za-z0-9]*[A-Z][A-Za-z0-9]*[0-9][A-Za-z0-9]*[a-z][A-Za-z0-9]*|[A-Za-z0-9]*[0-9][A-Za-z0-9]*[a-z][A-Za-z0-9]*[A-Z][A-Za-z0-9]*|[A-Za-z0-9]*[0-9][A-Za-z0-9]*[A-Z][A-Za-z0-9]*[a-z][A-Za-z0-9]*)$";

【讨论】:

    【解决方案4】:

    您可以将其拆分为 3 个单独的正则表达式来测试每种情况。

    [a-z][A-Z][0-9]

    将这些匹配的结果结合在一起,您就可以获得您想要的结果。

    编辑:

    如果您只想匹配字母数字,您应该按照 Ed Head 在 cmets 中的建议执行 ^[a-zA-Z0-9]+$

    【讨论】:

    • 如果要求字符串只包含这些字符,请添加一个额外的正则表达式^[a-zA-Z0-9]+$
    • 这不起作用,因为它不允许非字母或数字的字符
    • 请重新阅读 - 我写了 JUST - 那是在更新之前。
    • 知道了,早上 6:30 就可以了哈哈
    • 我试过了,这个输入参数76afbrzt应该是不正确的,但它返回正确。我试过这个查询select * from tb_m_menu where '76afbrzt' regexp '^[a-zA-Z0-9]+$';
    【解决方案5】:

    使用前瞻断言,您可以这样做:

    /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*$/
    

    更新:mysql似乎不支持环视断言。

    【讨论】:

    • 存储过程是否使用不同的正则表达式引擎?因为 MySQL 的引擎不支持环视断言。
    • 这匹配任意字符,例如 '%aAA9' 通过这个正则表达式
    • 他的问题是模棱两可的......它并没有说不允许其他字符。
    • 在此验证中只允许使用字母数字。 @JohnCorbett:我试过你的正则表达式,但它返回错误Got error 'repetition-operator operand invalid' from regexp
    • 我只是查看了文档。您的解决方案似乎无法正常工作,因为正则表达式引擎不支持环视。
    【解决方案6】:

    我的解决方案是导致一个长表达式,因为我将排列所有 6 种可能性,找到的大写字母、小写字母和所需的数字可以排列在字符串中:

    ^(.*[a-z].*[A-Z].*[0-9].*|
      .*[a-z].*[0-9].*[A-Z].*|
      .*[A-Z].*[a-z].*[0-9].*|
      .*[A-Z].*[0-9].*[a-z].*|
      .*[0-9].*[a-z].*[A-Z].*|
      .*[0-9].*[A-Z].*[a-z].*)$
    

    编辑:忘记了结尾和开头的.*

    【讨论】:

    • 这允许像 #a*B$1 这样的字符串(正如 OP 现在指出的那样)应该是非法的。
    • 我试过这样,但还是不正确SELECT * FROM my_table WHERE 'aS78fhE0' REGEXP '^(.*[a-z].*[A-Z].*[0-9].*| .*[a-z].*[0-9].*[A-Z].*| .*[A-Z].*[a-z].*[0-9].*| .*[A-Z].*[0-9].*[a-z].*| .*[0-9].*[a-z].*[A-Z].*| .*[0-9].*[A-Z].*[a-z].*)$ '
    • 尝试从该正则表达式中删除空格!
    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多