什么_?在以下正则表达式中意味着什么?

时间:2014-10-09 04:20:28

标签: ruby-on-rails ruby regex

_?在以下rails regex中的含义是什么?

/\A_?[a-z]_?(?:[a-z0-9.-]_?)*\z/i

我试图破译正则表达式如下

# regex explained
# \A    :    matches the beginning of the string
# _?    :    
# [     :    beginning of character group
# a-z   :    any lowercase letter
# ]     :    end of character group
# _?    :    
# (     :    is a capture group, anything matched within the parens is saved for later use
# ?:    :    non-capturing group: matches below, but doesn't store a back-ref
# [     :    beginning of character group
# a-z   :    any lowercase letter
# A-Z   :    any uppercase letter
# 0-9   :    any digit
# .     :    a fullstop or "any character" ??????
# _     :    an underscore
# ]     :    end of character group
# _?    :    
# )     :    See above
# *     :    zero or more times of the given characters
# \z    :    is the end of the string

3 个答案:

答案 0 :(得分:2)

_匹配下划线。

?匹配前一个字符中的零个或一个;基本上使前面的字符可选。

因此_?会匹配一个下划线(如果它存在),并且在没有它的情况下匹配。

答案 1 :(得分:1)

?表示前一个表达式应该显示0或1次,类似于*表示它应匹配0次或更多次,或+表示它应匹配1个或更多次。

因此,例如,使用RE /\A_?[A-Z]?\z/,以下字符串将匹配:

  • _O
  • _
  • P

但这些不会:

  • ____
  • A_
  • PP

您最初发布的RE声明:

  1. 字符串可以以下划线
  2. 开头
  3. 然后必须有一个小写字母
  4. 然后可能会有另一个下划线
  5. 对于字符串的其余部分,必须有字母,数字,句号或 - ,后面可以跟下划线
  6. 与此RE匹配的示例字符串:

    • _a_abcdefg
    • b_abc_def_
    • _qasdf_poiu_
    • a12345_
    • z._.._...._......_
    • u

答案 2 :(得分:1)

_?表示_是可选的。

它可以接受_sadasd_sadsadsa_asdasdasd_asdasdsadasdasd,即_分隔的字符串_是可选的。

参见演示。

http://regex101.com/r/hQ1rP0/89