Регулярное выражение для сопоставления столиц - PullRequest
4 голосов
/ 26 марта 2011
 def normalized?

    matches = match(/[^A-Z]*/)
    return matches.size == 0

  end

Это моя функция, работающая со строкой, проверяющая, содержит ли строка только заглавные буквы. Он отлично работает, исключая несоответствия, но когда я вызываю его в строке типа "ABC", он говорит, что нет совпадения, потому что, очевидно, matches.size равно 1, а не нулю. Кажется, там есть пустой элемент или около того.

Кто-нибудь может объяснить, почему?

Ответы [ 8 ]

3 голосов
/ 26 марта 2011

Ваше регулярное выражение неверно./[^A-Z]*/ означает «соответствовать нулю или нескольким символам, которые не находятся между A и Z в любом месте строки».Строка ABC содержит ноль символов, которые не находятся между A и Z, поэтому она соответствует регулярному выражению.

Измените ваше регулярное выражение на /^[^A-Z]+$/.Это означает «соответствует одному или нескольким символам, которые не находятся между A и Z, и убедитесь, что каждый символ между началом и концом строки не находится между A и Z».Тогда строка ABC не будет совпадать, и тогда вы можете проверить matches[0].size или что-то еще, согласно ответу sepp2k.

3 голосов
/ 26 марта 2011

Ваше регулярное выражение неверно - если вы хотите, чтобы оно совпадало ТОЛЬКО с заглавными строками, используйте /^[A-Z]+$/.

2 голосов
/ 26 марта 2011
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 
2 голосов
/ 26 марта 2011

MatchData#size возвращает количество групп захвата в регулярном выражении плюс одну, так что md[i] получит доступ к действительной группе, если i < md.size. Таким образом, значение, возвращаемое size, зависит только от регулярного выражения, а не от совпадающей строки, и никогда не будет равно 0.

Вы хотите matches.to_s.size или matches[0].size.

0 голосов
/ 26 июня 2014

Этот вопрос требует более четкого ответа.Как прокомментировал tchrist , я бы хотел, чтобы он ответил.« Regex для совпадающих заглавных букв » должен использовать:

/\p{Uppercase}/

Как упоминает tchrist "отличается от общей категории \ p {Uppercase_Letter} aka \ p {Lu}.существуют не-буквы, которые считаются заглавными буквами "

0 голосов
/ 26 марта 2011

Если вы хотите знать, что входная строка целиком состоит из заглавных букв английского алфавита, то есть AZ, вы должны удалить Kleene Star, так как она будет соответствовать до и после каждого отдельного символа в любой входной строке (совпадение нулевой длины).Оператор !s[/[^A-Z]/] сообщает вам, если нет совпадения символов, отличных от A-to-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
0 голосов
/ 26 марта 2011

Существует only 1 регулярное выражение, которое определяет строку только с All прописными:

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
--------
0 голосов
/ 26 марта 2011

* в вашем регулярном выражении означает, что оно соответствует любому количеству не прописных символов, включая ноль. Так что это всегда соответствует всему. Исправление заключается в удалении *, тогда он не будет соответствовать строке, содержащей только заглавные буквы. (Хотя вам понадобится другой тест, если строки нулевой длины не разрешены.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...