我正在尝试使用Ruby的语法编写正则表达式来匹配包含大写和小写字母的单词。
我最初会使用([A-Z]+[a-z]+|[a-z]+[A-Z]+)+
来做到这一点,但它与“YeSmAtCH”或“yEsMaTch”之类的所有单词都不匹配,至少根据this test。
我可以使用什么表达式来匹配包含大写和小写字母的单词的完整?
答案 0 :(得分:2)
由于你正在使用Ruby,所以回答可能会受益于断言,断言字母不应全部为大写或小写:
\b(?![a-z]+\b|[A-Z]+\b)[a-zA-Z]+
故障:
\b
匹配字边界(?!
开始否定前瞻
[a-z]+\b
匹配小写字词|
或[A-Z]+\b
匹配大写字词)
前瞻结束[a-zA-Z]+
匹配字母答案 1 :(得分:2)
您可以通过检查字符串是否包含大写和小写值以及(可选)确保字符串中不存在其他字符,而无需创建详细的正则表达式。我建议采用这种方法,因为我觉得最容易阅读/维护。
s = %w[NOMATCH nomatch yEsMaTcH YeSmAtCh yEsMaTch YeSmAtCH]
p s.select{|x| x =~ /[a-z]/ and x =~ /[A-Z]/}
s = %w[NOMATCH nomatch yEsMaTcH YeSmAtCh yEsMaTch YeSmAtCH]
p s.select{|x| x =~ /[a-z]/ and x =~ /[A-Z]/ and x !~ /[^a-z]/i}
您也可以使用此变体:
s = %w[NOMATCH nomatch yEsMaTcH YeSmAtCh yEsMaTch YeSmAtCH]
p s.select{|x| x =~ /[[:lower:]]/ and x =~ /[[:upper:]]/}
更好的是,您可以使用Unicode类来匹配其他脚本中的特殊字符,例如é
和Ç
:
s = %w[NOMATCH nomatch yEsMaTcH YeSmAtCh yEsMaTch YeSmAtCH]
p s.select{|x| x =~ /\p{Ll}/ and x =~ /\p{Lu}/}
但是,如果您只使用正则表达式方法,有几种方法可以实现此目的:
如果内容为多行,则以下方法需要为在线正则表达式编辑器启用{strong> - 您不需要在Ruby中执行此操作它是默认功能。
m
答案 2 :(得分:0)
我建议使用正则表达式来确定单词是否包含小写字母和大写字母,然后返回单词,否则返回nil
。如果同时存在小写和大写字母,那么这比构造一个返回单词的正则表达式更简单,更快。
R = /
(?: # begin a non-capture group
[A-Z] # match an uppercase letter
[a-z] # match a lowercase letter
| # or
[a-z] # match a lowercase letter
[A-Z] # match an uppercase letter
) # end non-capture group
/x # free-spacing regex definition mode
def both_cases?(word)
word.match?(R) ? word : nil
end
both_cases?("abBa") #=> "abBa"
both_cases?("ABbA") #=> "ABbA"
both_cases?("abcd") #=> nil
both_cases?("ABCD") #=> nil