我想匹配仅包含大写字母和数字的“3 T1F ROHITE01WMILWWI16”。条件是它,必须两者兼而有之。它不应该对所有字母和数字都返回 true。
测试用例:
我正在使用 ^[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 与上述相同,但数字和大写字母字符类交换以匹配
1A
或 A1
字符串。 $
- 字符串结尾 因此,所需的最小字符串长度为 2 个字符。
见 regex demo和 IDEONE 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/