我正在尝试构建一个只允许以下内容的Ruby REGEX:
some string (read letter only characters)
some string followed by numbers
some string followed by a period and another string
some string followed by a period and another string followed by numbers
period is only allowed if another string follows it
no other periods are allowed afterwards
numbers may only be at the very end
我有\A[[^0-9.]a-z]*([0-9]*|((.)([[^0-9]a-z]*)[0-9]*))\z
但我无法得到我需要的东西。这允许:
test.
test..
test.123
什么是正确的REGEX?如果有人能解释我做错了什么,以帮助我了解未来也会很棒。
编辑:更新要求更具描述性
答案 0 :(得分:1)
所以我猜你希望 identifiers
由.
分隔。
按identifier
我的意思是:
写成语法,看起来像这样:
EXPR := IDENT "." EXPR | IDENT
IDENT := [A-Z]\w*
这个正则表达式如下:
/\A[A-Z]\w*(\.[A-Z]\w*)*\Z/i
尝试here
注意由于 \w
的行为,此模式也会在第一个字符后接受_
(下划线)(即{{1也将通过)。
编辑以反映问题的更新
所以你想要的语法实际上是这样的:
test_123
然后正则表达式就是这样:
EXPR := IDENT [0-9]*
IDENT := STR | STR "." STR
STR := [A-Z]+
尝试一下here
解释如下:
/\A[A-Z]+(\.[A-Z]+)?[0-9]*\z/i
答案 1 :(得分:0)
你可以尝试
^[a-z]+\.?[a-z]+[0-9]*$
这是demo
注意:使用\A
和\z
来匹配字符串的开头和结尾而不是行。
您需要转义匹配任何单个字符的.
。
模式说明:
^ the beginning of the line
[a-z]+ any character of: 'a' to 'z' (1 or more times)
\.? '.' (optional)
[a-z]+ any character of: 'a' to 'z' (1 or more times)
[0-9]* any character of: '0' to '9' (0 or more times)
$ the end of the line