Как мне выбрать строку, в которой слово начинается с заглавной буквы с помощью регулярного выражения?

#ruby #regex

#ruby #регулярное выражение

Вопрос:

Допустим, у меня есть такой массив:

 > names
=> ["John", "Van", "der", "and", "an", "the boys and John Smith"]
 

Как мне просто выбрать John Van и the boys and John Smith из этого массива?

Я попробовал это регулярное выражение, но в нем отсутствует последняя строка, которая является самой сложной:

 /^[A-Z]w*/
 

Каков более полный подход, который может выявить другие случаи, когда слово с заглавной буквы появляется в середине строки, которую я могу пропустить?

Редактировать 1

Другая строка, которую я хотел бы, чтобы она могла захватить, — это: John Van der Lyn , где есть имя, в котором есть слово с общей буквой в имени и фамилии.

Комментарии:

1. сопоставьте все строки с заглавными словами или просто с заглавными именами?

2. @sagarpandya82 Я соглашусь на все строки с заглавными буквами, потому что я считаю, что имена с заглавной буквы невозможны. Однако, если у вас есть предложение по захвату только с заглавной буквы names….do делитесь, потому что это конечная цель.

3. ^(?=.*b[A-Z]).*

4. @revo Это выглядит законно. Продолжайте и добавьте это в качестве ответа с кратким описанием, и я приму его. Спасибо!

5. Ваше регулярное выражение сработало бы, если бы вы удалили привязку в начале строки /[A-Z]w*/

Ответ №1:

Регулярное выражение:

 ^(?=.*b[A-Z]).*
 

Это выгодно благодаря позитивному взгляду. Он проверяет, есть ли какое-либо слово, начинающееся с заглавной буквы во входной строке, а затем сопоставляет все это.

Объяснение:

 ^               # Assert beginning of subject string
(?=             # Construct a positive lookahead
    .*b[A-Z]       # Match start of a capitalized word
)               # End of lookahead
.*              # If lookahead was successful, match whole subject string
 

Ответ №2:

Вы можете использовать простой bp{Lu} , который найдет любую заглавную букву Юникода, с которой начинается слово (как b граница слова):

 def get_names(names)
  names.select{ |name| name[/bp{Lu}/] }
end

names = ["John", "Van", "der", "and", "an", "the boys and John Smith"]
puts get_names(names) # ['John', 'Van', 'the boys and John Smith']
 

Смотрите демонстрацию Ruby