正则表达式仅用于字母数字而不用于数字

标签 regex r

我想匹配仅包含大写字母和数字的“3 T1F ROHITE01WMILWWI16”。条件是它,必须两者兼而有之。它不应该对所有字母和数字都返回 true。

测试用例:

  • 3 T1F ROHITE01WMILWI16
  • 3 T1F ROHITE01WMILwI16
  • 3 T1F ROHITE01WMIL.I16
  • 1234
  • aaaa
  • T1F ROHITH01WMILWI16

  • 我正在使用 ^[0-9 A-Z]+$ 它正确匹配第一个和最后一个测试用例,但也为第四个测试用例返回 true,即 1234。

    最佳答案

    您可以使用

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

    它匹配
  • ^ - 字符串的开始
    然后是两种选择。备选方案 1:
  • [0-9 A-Z]* - 0+ 允许的字符
  • [A-Z] - 一个大写 ASCII 字母(强制子模式)
  • [0-9 A-Z]* - 0+ 允许的字符
  • [0-9] - 一个数字
  • [0-9 A-Z]* - 0+ 允许的字符
    备选方案 2 与上述相同,但数字和大写字母字符类交换以匹配 1AA1字符串。
  • $ - 字符串结尾

  • 因此,所需的最小字符串长度为 2 个字符。

    regex demoIDEONE demo :
    s <- c("3 T1F ROHITE01WMILWI16", "3 T1F ROHITE01WMILwI16", "3 T1F ROHITE01WMIL.I16", "1234", "aaaa", "T1F ROHITH01WMILWI16")
    grep("^[0-9 A-Z]*[A-Z][0-9 A-Z]*[0-9][0-9 A-Z]*$", s, value=TRUE)
    

    如果您需要支持任意长度的字符串,请使用 this PCRE regex :
    ^(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])[0-9 A-Z]*$
    
    (?=[^A-Z]*[A-Z])前瞻需要至少一个大写字母和 (?=[^0-9]*[0-9])需要一位数。

    IDEONE demo :
    s <- c("3 T1F ROHITE01WMILWI16", "3 T1F ROHITE01WMILwI16", "3 T1F ROHITE01WMIL.I16", "1234", "aaaa", "T1F ROHITH01WMILWI16")
    grep("^(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])[0-9 A-Z]*$", s, perl=TRUE, value=TRUE)
    

    关于正则表达式仅用于字母数字而不用于数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35766305/

    相关文章:

    python - 使用 re.sub() 递归

    r - 如何找到所有可能的k个整数,它们的总和等于R中的某个数字

    r - 如何从R中的列表中删除函数?

    java - 使用正则表达式解析 URL

    javascript - 瑞典字符用 javascript 检查?

    javascript - 在网页上进行文本替换的最简洁方法? (使用 GreaseMonkey)

    R:阿尔法!他们什么都不做!

    r - 具有不同列类型的 tidyr::unnest()

    r - 图例标题的垂直对齐(ggplot2)

    javascript - 删除过多的空白行