def normalized?
matches = match(/[^A-Z]*/)
return matches.size == 0
end
这是我在字符串上运行的函数,检查字符串是否只包含大写字母。它可以很好地排除非匹配,但当我在像"ABC"
这样的字符串上调用它时,它表示不匹配,因为显然matches.size
是1而不是零。其中似乎有一个空元素。
有人可以解释原因吗?
答案 0 :(得分:3)
您的正则表达式错误 - 如果您希望它仅匹配大写字符串,请使用/^[A-Z]+$/
。
答案 1 :(得分:3)
您的正则表达式不正确。 /[^A-Z]*/
表示“在字符串中的任何位置匹配不在A
和Z
之间的零个或多个字符”。字符串ABC
的字符不在A
和Z
之间,因此它与正则表达式匹配。
将正则表达式更改为/^[^A-Z]+$/
。这意味着“匹配不在A
和Z
之间的一个或多个字符,并确保字符串开头和结尾之间的每个字符都不在A
和{{1}之间}”。然后字符串Z
将不匹配,然后您可以根据sepp2k的答案检查ABC
或其他内容。
答案 2 :(得分:2)
MatchData#size
返回正则表达式中的捕获组数加1,以便md[i]
访问iff i < md.size
的有效组。因此size
返回的值仅取决于正则表达式,而不是匹配的字符串,并且永远不会为0.
您需要matches.to_s.size
或matches[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}。那是因为存在非大写字母计为大写”