提问人:cpp 提问时间:11/5/2023 最后编辑:cpp 更新时间:11/7/2023 访问量:78
带有字母和数字组合的正则表达式
regex with letters and number combination
问:
我正在尝试为一种格式创建一个正则表达式:
TNP-XXXXX型
只允许使用字母 TNP 和 - 且 XXXXX 是数字,最多只能接受 5 个数字。
这是我到目前为止所拥有的:
if !(/TNP-[\d]{5,}$/.match(tc_number))
raise "Is not in the correct format, It should be TNP-XXXXX"
end
答:
1赞
Schwern
11/5/2023
#1
您的正则表达式存在两个问题。
它一开始就没有锚定,所以会匹配。
ABC TNP-12345
[\d]{5,}
表示至少匹配 5 位数字。所以不会匹配。TNP-123
也是不必要的。 用于构建任意字符类。 已经是一个等同于字符类的字符类,不需要放在字符类中。[]
[]
\d
[0-9]
相反,您希望指示以 1 到 5 位数字开头的字符串。/^TNP-\d{1,5}$/
TNP-
tests = ["ABC TNP-12345", "TNP-12345", "TNP-123", "TNP-", "TNP-ABC", "ABC-12345", "TNC-123456"]
tests.each do |test|
puts "#{test} - #{/^TNP-[\d]{1,5}$/.match?(test)}"
end
ABC TNP-12345 - false
TNP-12345 - true
TNP-123 - true
TNP- - false
TNP-ABC - false
ABC-12345 - false
TNC-123456 - false
评论
0赞
cpp
11/5/2023
谢谢,这就是我一直在寻找的
1赞
Reilas
11/5/2023
#2
"...只允许使用字母 TNP 和 - 且 XXXXX 是数字,最多只能接受 5 个数字。..."
用于匹配前面的元素,1 到 5 次。{1,5}
此外,使用单词边界语法来避免匹配子序列。\b
\bTNP-\d{1,5}\b
0赞
Pascal
11/5/2023
#3
- 您应该将正则表达式锚定到行/字符串的开头和结尾(使用或取决于您需要的内容)
\A\z
^$
- 您不需要,因为它用于指定一组字符并且已经是一个组
[]
\d
- 如果不需要捕获,则应使用而不是(性能更高)
match?
match
您可以在 rubular 等网站上测试您的正则表达式:https://rubular.com/r/U4vUVb68TiIzRp
总之:
RE_FORMAT = /^TNP-\d{5}$/
if !(RE_FORMAT.match?(tc_number))
raise "Is not in the correct format, It should be TNP-XXXXX"
end
评论
0赞
Pascal
11/7/2023
哦,从错误的实验中复制而来。
评论
\d{1,5}
\d{5,}
\d{1,5}
"9999999999999"