匹配资本的正则表达式

时间:2011-03-25 22:56:45

标签: ruby regex match

 def normalized?

    matches = match(/[^A-Z]*/)
    return matches.size == 0

  end

这是我在字符串上运行的函数,检查字符串是否只包含大写字母。它可以很好地排除非匹配,但当我在像"ABC"这样的字符串上调用它时,它表示不匹配,因为显然matches.size是1而不是零。其中似乎有一个空元素。

有人可以解释原因吗?

8 个答案:

答案 0 :(得分:3)

您的正则表达式错误 - 如果您希望它仅匹配大写字符串,请使用/^[A-Z]+$/

答案 1 :(得分:3)

您的正则表达式不正确。 /[^A-Z]*/表示“在字符串中的任何位置匹配不在AZ之间的零个或多个字符”。字符串ABC的字符不在AZ之间,因此它与正则表达式匹配。

将正则表达式更改为/^[^A-Z]+$/。这意味着“匹配不在AZ之间的一个或多个字符,并确保字符串开头和结尾之间的每个字符都不在A和{{1}之间}”。然后字符串Z将不匹配,然后您可以根据sepp2k的答案检查ABC或其他内容。

答案 2 :(得分:2)

MatchData#size返回正则表达式中的捕获组数加1,以便md[i]访问iff i < md.size的有效组。因此size返回的值仅取决于正则表达式,而不是匹配的字符串,并且永远不会为0.

您需要matches.to_s.sizematches[0].size

答案 3 :(得分:2)

ruby-1.9.2-p180>   def normalized? s
ruby-1.9.2-p180?>    s.match(/^[[:upper:]]+$/) ? true : false
ruby-1.9.2-p180?>  end
 => nil 
ruby-1.9.2-p180>  normalized? "asdf"
 => false 
ruby-1.9.2-p180>  normalized? "ASDF"
 => true 

答案 4 :(得分:0)

正则表达式中的*表示它匹配任意数量的非大写字符,包括零。所以它始终匹配一切。修复是删除*,然后它将无法匹配仅包含大写字符的字符串。 (如果不允许使用零长度字符串,则需要进行不同的测试。)

答案 5 :(得分:0)

1正则表达式定义了仅包含所有大写字母的字符串:

def onlyupper(s)
    (s =~ /^[A-Z]+$/) != nil
end

真相表:

/[^A-Z]*/:
 Testing  'asdf'     matched  'asdf'     length  4
 Testing  'HHH'      matched  ''         length  0
 Testing  ''         matched  ''         length  0
 Testing  '-=AAA'    matched  '-='       length  2
--------
/[^A-Z]+/:
 Testing  'asdf'     matched  'asdf'     length  4
 Testing  'HHH'      matched  nil
 Testing  ''         matched  nil
 Testing  '-=AAA'    matched  '-='       length  2
--------
/^[^A-Z]*$/:
 Testing  'asdf'     matched  'asdf'     length  4
 Testing  'HHH'      matched  nil
 Testing  ''         matched  ''         length  0
 Testing  '-=AAA'    matched  nil
--------
/^[^A-Z]+$/:
 Testing  'asdf'     matched  'asdf'     length  4
 Testing  'HHH'      matched  nil
 Testing  ''         matched  nil
 Testing  '-=AAA'    matched  nil
--------
/^[A-Z]*$/:
 Testing  'asdf'     matched  nil
 Testing  'HHH'      matched  'HHH'      length  3
 Testing  ''         matched  ''         length  0
 Testing  '-=AAA'    matched  nil
--------
/^[A-Z]+$/:
 Testing  'asdf'     matched  nil
 Testing  'HHH'      matched  'HHH'      length  3
 Testing  ''         matched  nil
 Testing  '-=AAA'    matched  nil
--------

答案 6 :(得分:0)

如果您想知道输入字符串完全由英文大写字母组成,即A-Z,那么您必须删除Kleene Star,因为它将在任何输入字符串中的每个字符之前和之后匹配(零长度匹配)。语句!s[/[^A-Z]/]告诉您是否与非A到Z字符不匹配:

irb(main):001:0> def normalized? s
irb(main):002:1>     return !s[/[^A-Z]/]
irb(main):003:1> end
=> nil
irb(main):004:0> normalized? "ABC"
=> true
irb(main):005:0> normalized? "AbC"
=> false
irb(main):006:0> normalized? ""
=> true
irb(main):007:0> normalized? "abc"
=> false

答案 7 :(得分:0)

这个问题需要一个更明确的答案。正如tchrist所述,我希望他能回答。 “匹配大写的正则表达式”将使用:

/\p{Uppercase}/

正如tchrist提到的“不同于一般类别\ p {Uppercase_Letter}又名\ p {Lu}。那是因为存在非大写字母计为大写”