我正在尝试创建一个格式的正则表达式:公司简介只允许使用字母TNP和-,XXXXX是数字,最多只能接受5个数字。以下是我到目前为止所做的:
if !(/TNP-[\d]{5,}$/.match(tc_number)) raise "Is not in the correct format, It should be TNP-XXXXX" end
字符串
sigwle7e1#
正则表达式有两个问题。1.它在开始时没有锚定,所以ABC TNP-12345将匹配。
ABC TNP-12345
[\d]{5,}
TNP-123
[]
\d
[0-9]
/^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
个字符
vltsax252#
使用{1,5}匹配前面的元素,1 到 5 次。此外,使用\b字边界语法来避免匹配子序列。
{1,5}
\b
\bTNP-\d{1,5}\b
busg9geu3#
\A\z
^$
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
3条答案
按热度按时间sigwle7e1#
正则表达式有两个问题。
1.它在开始时没有锚定,所以
ABC TNP-12345
将匹配。[\d]{5,}
表示匹配 * 至少 * 5个数字。因此TNP-123
将不匹配。[]
也是不必要的。[]
用于构建任意字符类。\d
已经是一个等价于[0-9]
的字符类,不需要放在字符类中。相反,您希望
/^TNP-\d{1,5}$/
表示以TNP-
开头的1到5位数字的字符串。个字符
vltsax252#
使用
{1,5}
匹配前面的元素,1 到 5 次。此外,使用
\b
字边界语法来避免匹配子序列。字符串
busg9geu3#
\A\z
或^$
)[]
,因为它用于指定一组字符,而\d
已经是一个组match?
而不是match
(性能更高)你可以在rubular:https://rubular.com/r/U4vUVb68TiIzRp这样的网站上测试你的Regexp
简而言之:
字符串