带有字母和数字组合的正则表达式

regex with letters and number combination

提问人:cpp 提问时间:11/5/2023 最后编辑:cpp 更新时间:11/7/2023 访问量:78

问:

我正在尝试为一种格式创建一个正则表达式:

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
Ruby-on-Rails 正则表达式 Ruby

评论

4赞 Nick 11/5/2023
那么你当前的代码有什么问题呢?
1赞 AdrianHHH 11/5/2023
最多可使用 5 次。不需要方括号。而表示 5 或更多。\d{1,5}\d{5,}
0赞 Cary Swoveland 11/5/2023
@AdrianHHH,别忘了匹配.\d{1,5}"9999999999999"
0赞 AdrianHHH 11/5/2023
@CarySwoveland同意,但问题将正则表达式的该部分与之前和之后的其他内容一起使用。

答:

1赞 Schwern 11/5/2023 #1

您的正则表达式存在两个问题。

  1. 它一开始就没有锚定,所以会匹配。ABC TNP-12345

  2. [\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 个数字。..."

用于匹配前面的元素,15 次。{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
哦,从错误的实验中复制而来。