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

dldeef67  于 2023-11-18  发布在  Ruby
关注(0)|答案(3)|浏览(125)

我正在尝试创建一个格式的正则表达式:
公司简介
只允许使用字母TNP和-,XXXXX是数字,最多只能接受5个数字。
以下是我到目前为止所做的:

if !(/TNP-[\d]{5,}$/.match(tc_number))
   raise "Is not in the correct format, It should be TNP-XXXXX"
end

字符串

sigwle7e

sigwle7e1#

正则表达式有两个问题。
1.它在开始时没有锚定,所以ABC TNP-12345将匹配。

  1. [\d]{5,}表示匹配 * 至少 * 5个数字。因此TNP-123将不匹配。
    []也是不必要的。[]用于构建任意字符类。\d已经是一个等价于[0-9]的字符类,不需要放在字符类中。
    相反,您希望/^TNP-\d{1,5}$/表示以TNP-开头的1到5位数字的字符串。
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

个字符

vltsax25

vltsax252#

  • "...只允许使用字母TNP和-,XXXXX是数字,最多只能接受5个数字..."*

使用{1,5}匹配前面的元素,15 次。
此外,使用\b字边界语法来避免匹配子序列。

\bTNP-\d{1,5}\b

字符串

busg9geu

busg9geu3#

  • 您应该将Regexp锚到Line/String的开始和结束(根据需要使用\A\z^$
  • 您不需要[],因为它用于指定一组字符,而\d已经是一个组
  • 如果不需要捕获,则应使用match?而不是match(性能更高)

你可以在rubular:https://rubular.com/r/U4vUVb68TiIzRp这样的网站上测试你的Regexp
简而言之:

RE_FORMAT = /^TNP-\d{5}$/
if !(RE_FORMAT.match?(tc_number))
   raise "Is not in the correct format, It should be TNP-XXXXX"
end

字符串

相关问题