43

当たり前のように見えるので、これを尋ねるのは恥ずかしいですが、文字列内の特定の文字がRubyで大文字か小文字かをどのように判断するのでしょうか。String私はクラスで明白な缶詰の解決策を見ません。

非ASCIIコードを考慮しない以下に頼りました:

def is_lower?(c)
  c >= 'a' && c <= 'z'
end

def is_upper?(c)
  ! is_lower(c)
end

私が検討した他の何かは次のとおりです。

def is_lower?(c)
    c != c.upcase
end

これにはもっと慣用的なものがありますか?

4

6 に答える 6

54

正規表現パターンを使用: [AZ] または:

/[[:upper:]]/.match(c)
于 2012-10-03T17:06:06.877 に答える
31

これほど慣用的なものはないと思います。文字列を引数として渡す代わりにできる唯一のことは、Stringクラスにモンキー パッチを適用することです。

class String
  def is_upper?
    self == self.upcase
  end

  def is_lower?
    self == self.downcase
  end
end

"a".is_upper? #=> false
"A".is_upper? #=> true

上記のコメンターとモンキーパッチによって提案された回答の方法を使用して、Stringこれを行うことができます:

class String
  def is_upper?
    !!self.match(/\p{Upper}/)
  end

  def is_lower?
    !!self.match(/\p{Lower}/)
    # or: !self.is_upper?
  end
end
于 2012-10-03T17:06:11.417 に答える
6

文字列が小文字であるとはどういう意味ですか? 文字列に小文字のみが含まれているということですか、それとも大文字が含まれていないということですか? 私の場合、私は欲しい:

"a2".is_lower? #=> true

..これは私を次のように導きます:

class String

  def is_upper?
    not self.match /[[:lower:]]/
  end

  def is_lower?
    not self.match /[[:upper:]]/
  end

end

/\p{Lower}/より良いかもしれませんが、Ruby 1.8 ではサポートされていないことに注意してください。

于 2015-07-18T23:04:52.733 に答える
5

Matching a conversion doesn't emulate the functionality of the libc isupper() and islower() functions in that both should return false for non alpha.

Ranges seem the easiest way to do this for single characters.

class String
  def islower?
    return false if self.size > 1
    ('a'..'z').include? self
  end

  def isupper?
    return false if self.size > 1
    ('A'..'Z').include? self
  end
end
于 2014-06-18T10:02:58.380 に答える
4

文字が大文字か小文字かを確認する最も簡単な方法:

#Can be any character
char = 'a'
if char === char.capitalize then
  return 'Character is uppercase.'
else
  return 'Character is lowercase.'
end

これは非常に単純化if loopされており、大文字の形式と等しいかどうかをチェックすることで、文字の「大文字と小文字」を判別できます。すでに大文字の場合は、明らかにtrue.

于 2013-11-29T20:27:54.700 に答える