2016-10-29 3 views
-1

мне нужно, чтобы извлечь все @usernames из строки (для щебет), используя рельсы/рубин:Extract все слова с символом @ из строки

String Examples: 
"@tom @john how are you?" 
"how are you @john?" 
"@tom hi" 

Функция должна извлечь все имена пользователей из строки, а также без специальные символы, запрещенные для имен пользователей ... как вы видите "?" в примере ...

+1

Пожалуйста, покажите ваш желаемый результат , –

+1

Что вы ожидаете от '@user? Name?'? –

+0

Я создал кажущееся устойчивое регулярное выражение '/ (? <= \ S | \ A) (@ \ w +) (? = \, | \? | \ S | \. \ S) /'. [См. Здесь для демонстрации на Rubular] (http://www.rubular.com/r/GlbPCtMSHE). Кажется, я не могу заставить его работать с Ruby 'match' или' scan', поэтому я не отправляю его в качестве ответа, и любые приглашенные. –

ответ

1

От "Why can't I register certain usernames?":

имя пользователя может содержать только буквенно-цифровые символы (буквы A-Z, цифры 0-9), за исключением подчеркивания, как было отмечено выше. Убедитесь, что ваше имя пользователя не содержит символов, тире или пробелов.

\w metacharacter is equivalent to [a-zA-Z0-9_]:

/\w/ - Слово символ ([a-zA-Z0-9_])

Просто сканирование для @\w+ преуспеет в соответствии с этим:

strings = [ 
    "@tom @john how are you?", 
    "how are you @john?", 
    "@tom hi", 
    "@foo @_foo @foo_ @foo_bar @f123bar @f_123_bar" 
] 

strings.map { |s| s.scan(/@\w+/) } 
# => [["@tom", "@john"], 
#  ["@john"], 
#  ["@tom"], 
#  ["@foo", "@_foo", "@foo_", "@foo_bar", "@f123bar", "@f_123_bar"]] 
+0

извините за отставание. Этот ответ лучше всего подходит для моего сценария и ситуации! Спасибо огромное! – Gediminas

1

Есть несколько способов сделать это - вот один из способов:

string = "@tom @john how are you?" 
words = string.split " " 
twitter_handles = words.select do |word| 
    word.start_with?('@') && word[1..-1].chars.all? do |char| 
    char =~ /[a-zA-Z1-9\_]/ 
    end && word.length > 1 
end 

char =~ регулярное выражение будет принимать только alphaneumerics и подчеркивание

1
r =/
    @    # match character 
    [[[:alpha:]]]+ # match one or more letters 
    \b    # match word break 
    /x    # free-spacing regex definition mode 

"@tom @john how are you? And you, @andré?".scan(r) 
    #=> ["@tom", "@john", "@andré"] 

Если вы хотите вместо того, чтобы вернуть

["tom", "john", "andré"] 

изменить первую строку регулярного выражения изОт 10 до

(?<[email protected]) 

, который является положительным просмотра назад. Для этого требуется наличие символа "@", но он не будет частью матча.