用于匹配包含大写和小写字母的单词的正则表达式

时间:2018-04-20 17:14:53

标签: ruby regex

我正在尝试使用Ruby的语法编写正则表达式来匹配包含大写和小写字母的单词。

我最初会使用([A-Z]+[a-z]+|[a-z]+[A-Z]+)+来做到这一点,但它与“YeSmAtCH”或“yEsMaTch”之类的所有单词都不匹配,至少根据this test

我可以使用什么表达式来匹配包含大写和小写字母的单词的完整

3 个答案:

答案 0 :(得分:2)

由于你正在使用Ruby,所以回答可能会受益于断言,断言字母不应全部为大写或小写:

\b(?![a-z]+\b|[A-Z]+\b)[a-zA-Z]+

Live demo

故障:

  • \b匹配字边界
  • (?!开始否定前瞻
    • [a-z]+\b匹配小写字词
    • |
    • [A-Z]+\b匹配大写字词
  • )前瞻结束
  • [a-zA-Z]+匹配字母

答案 1 :(得分:2)

我的建议方法

您可以通过检查字符串是否包含大写和小写值以及(可选)确保字符串中不存在其他字符,而无需创建详细的正则表达式。我建议采用这种方法,因为我觉得最容易阅读/维护。

See code in use here

s = %w[NOMATCH nomatch yEsMaTcH YeSmAtCh yEsMaTch YeSmAtCH]
p s.select{|x| x =~ /[a-z]/ and x =~ /[A-Z]/}

See code in use here

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