Ruby REGEX用于字母和数字或字母,后跟句号,字母和数字

时间:2014-08-09 11:24:24

标签: ruby regex

我正在尝试构建一个只允许以下内容的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?如果有人能解释我做错了什么,以帮助我了解未来也会很棒。

编辑:更新要求更具描述性

2 个答案:

答案 0 :(得分:1)

所以我猜你希望identifiers.分隔。

identifier我的意思是:

  • 由字母数字字符组成的字符串
  • 不以数字开头
  • 并且至少是一个characer。

写成语法,看起来像这样:

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