def normalized?
matches = match(/[^A-Z]*/)
return matches.size == 0
end
这是我的函数,用于操作字符串,检查字符串是否只包含大写字母。它可以很好地排除不匹配的情况,但是当我对像
"ABC"
这样的字符串调用它时,它会说没有匹配项,因为显然matches.size
为1而不是零。似乎其中有一个空元素。有人能解释一下吗?
/^[A-Z]+$/
。[]
)内部有一个插入符号(^
),表示不是 A-Z
,星号表示它可能什么也不匹配。因此,我们在正则表达式的末尾加上结束定界符($
),并将 *
更改为 +
,以确保字符串至少有1个字符长。 - mwayMatchData#size
做他认为它应该做的事情,那么它就是完全正确的。 - sepp2k/[^A-Z]*/
的意思是“匹配零个或多个不在A
和Z
之间的字符,任何位置都可以”。字符串ABC
没有任何不在A
和Z
之间的字符,因此它与正则表达式匹配。/^[^A-Z]+$/
。这意味着“匹配一个或多个不在A
和Z
之间的字符,并确保从字符串开头到结尾的每个字符都不在A
和Z
之间”。然后,字符串ABC
将不匹配,然后您可以像sepp2k的答案那样检查matches [0] .size
或其他内容。matches [0] .size
,因为 matches
可能是 nil
。他当前方法的重点是正则表达式总是匹配的,并且他正在检查它是否匹配了空字符串或更实质的内容。 - sepp2kruby-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
MatchData#size
返回正则表达式中捕获组的数量加一,因此只有当 i < md.size
时,md[i]
才能访问有效的捕获组。因此,size
返回的值仅取决于正则表达式,而不是匹配的字符串,并且永远不会为0。matches.to_s.size
或 matches[0].size
。这个问题需要一个更清晰的答案。正如tchrist所评论的那样,我希望他能回答。"匹配大写字母的正则表达式"是使用:
/\p{Uppercase}/
\p {Uppercase}
将匹配单个大写Unicode光谱字母。他想确保字符串全部是 大写 字母。我猜一个简单的解决方法是先匹配单个\P{Uppercase}
然后失败。 - user557597只有一个正则表达式可以定义一个仅由全部大写字母组成的字符串:
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
--------
[A-Z]
足以保证某些内容完全是大写字母:它错过了ᴇ,ᴋ,Á,Æ,Þ,Ȝ,İ,Ə,Ⅻ等,而这些仅仅是拉丁文! A-Z显然是错误的:它错过了968个大写代码点。 必须使用\p{Uppercase}
来保证。请注意,派生的二进制属性\p{Uppercase}
与一般类别\p{Uppercase_Letter}
(也称为\p{Lu}
)不同。这是因为存在非字母计数为大写字母,例如罗马数字如Ⅷ和带圈字母如Ⓐ都是\p{Uppercase}
但不是\P{Lu}
。 - tchrist正则表达式中的*
表示匹配任意数量的非大写字符,包括零个。因此它总是匹配任何内容。解决方法是去掉*
,那么它将不能匹配只包含大写字符的字符串。(如果不允许空字符串,则需要进行不同的测试。)
!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
*
量词,仍在匹配结果上放置一个 !
条件时,仍会匹配空字符串。当空字符串并不代表由字母 A-Z 构成的字符串时,空字符串返回 true
。请参见我上面发布的真值表。 - user557597!/[^A-Z]+/
。 - user557597true
,因为@Samuel的需求是“检查一个字符串是否只包含大写字母”。空字符串“仅包含大写字母”。语句!s[/[^A-Z]/]
告诉你是否没有非A到Z字符的匹配。这是正确的答案,因为“大写字母”意味着A到Z。 - Staffan Nöteberg"" =~ /[A-Z]/
。不,空字符串什么都没有。 - user557597/[A-Z]/
测试是否至少有一个大写字母,这与“仅大写”不同。但是,这是一个子讨论。 :-) - Staffan Nöteberg/[A-Z]/
正向匹配,但实际上并没有。相反,"ABC" =~ /^$/
不匹配,但我们不会说"ABC"是空字符串。我认为没有什么可以作为一切的子集而存在,这将使(nothing == something)
成立。Nothing可能在质量上有益,但它在测试某些东西时是单独的信息。 - user557597
\p{Lu}
, 就应该始终使用它或者是[\p{Lu}\p{Lt}]
。在处理现代文本的代码中,[A-Z]
是一种应该避免使用的反模式和代码异味。 - tchrist\p{Lu}
更好,尽管它仍然错过了42个大写字母编码点。 - tchrist