2015-12-28 3 views
1

Я пытался выяснить, регулярное выражение для вывода только три буквы, а также исключить слово «не»Regex чтобы соответствовать три письма и удалить три буквы

То, что я пытался до сих пор:

  • .gsub(/^[A-z]+$/) (по-прежнему выдает такой же, как показано ниже)

  • Я также попробовал все на this post about Regex

Вот что мне нужно regexed:

bash: line 1: drs: command not found 
bash: line 2: tep: command not found 
bash: line 3: ldo: command not found 
bash: line 4: tep: command not found 
bash: line 5: txw: command not found 
bash: line 6: tep: command not found 
bash: line 7: jfp: command not found 
bash: line 8: mys: command not found 
bash: line 9: jhf: command not found 
bash: line 10: mjw: command not found 
bash: line 11: czw: command not found 
bash: line 12: txh: command not found 
bash: line 13: krn: command not found 
bash: line 14: sct: command not found 
bash: line 15: jad: command not found 

Я хочу, чтобы только выход:

drs 
tep 
ldo 
tep 
txw 
tep 
jfp 
mys 
jhf 
mjw 
czw 
txh 
krn 
sct 
jad 

Есть ли способ, что я могу это сделать? Пожалуйста, имейте в виду, что у меня есть несколько других трех буквенных комбинаций со всеми буквами алфавита.

+0

Буквы всегда в этом месте? Я имею в виду, всегда «bash: line xxxx: ABC: ....»? – zon7

+0

@ zon7 Да, они всегда в одном и том же месте, я отредактирую пост. – Bam

+0

Пожалуйста, прочтите «[ask]» и «[mcve]». Есть ли рабочий код? Есть ли выборка и ожидаемый результат? –

ответ

3

Почему regex? Вы усложнять свою жизнь:

def three_letters_excluding_not(text) 
    text 
     .split(/\W+/) 
     .select{|w| w.length == 3} 
     .reject{|w| w=="not} 
end 

Короткий, простой, легко читаемый, наслаждаться силой Ruby.

+0

Что такое 'w' for ..? – Bam

+1

@Bam Дополнительная информация на http://stackoverflow.com/questions/7622369/ruby-extracting-words-from-string' \ W' означает _non-word_ – Caridorc

+1

' w_ является блочной переменной. –

2

Это не похоже на хорошее использование регулярных выражений, так как вы имеете дело с полями:

str = "bash: line 14: krn: command not found" 
str.split(': ')[2] # => "krn" 

Вот более тщательное испытание:

[ 
    'bash: line 1: drs: command not found', 
    'bash: line 2: tep: command not found', 
    'bash: line 3: ldo: command not found', 
    'bash: line 4: tep: command not found', 
    'bash: line 5: txw: command not found', 
    'bash: line 6: tep: command not found', 
    'bash: line 7: jfp: command not found', 
    'bash: line 8: mys: command not found', 
    'bash: line 9: jhf: command not found', 
    'bash: line 10: mjw: command not found', 
    'bash: line 11: czw: command not found', 
    'bash: line 12: txh: command not found', 
    'bash: line 13: krn: command not found', 
    'bash: line 14: sct: command not found', 
    'bash: line 15: jad: command not found', 
].each do |str| 
    puts str.split(': ')[2] 
end 
# >> drs 
# >> tep 
# >> ldo 
# >> tep 
# >> txw 
# >> tep 
# >> jfp 
# >> mys 
# >> jhf 
# >> mjw 
# >> czw 
# >> txh 
# >> krn 
# >> sct 
# >> jad 

Если вы не знаете, как много пробелов будет окружать : разделителями, используйте strip для удаления ведущих и конечных пробелов из слова, снятого:

str.split(':')[2].strip 
+0

Итак, пробелы '2'? – Bam

+0

Не совсем. Вы можете выяснить, сколько. –

+0

О, я имел в виду, что' [2] 'ищет грубые два пробела? – Bam

-1

Это должно сделать:

"bash: line. : (.?):»

Это позволит получить все от Баша, пока„:“после строки и возврата в группе три или более букв, прежде чем„:“

Вы можете проверить его здесь http://rubular.com/

+0

Я не хочу возвращать «три или более буквы» только три, – Bam

+1

Он должен только вернуть три, но он готов вернуться больше. Это просто работает :) – zon7

1
str =<<_ 
bash: line 1: drs: command not found 
bash: line 2: tep: command not found 
bash: line 3: not: command not found 
bash: line 4: tep: command not found 
bash: line 5: txw: command not found 
_ 

r =/
    \d:\s+ # match a digit, colon and one or more spaces 
    \K  # forget everything matched so far 
    .{3} # match any three characters 
    /x  # extended/free-spacing regex definition mode 

str.scan r 
    #=> ["drs", "tep", "not", "tep", "txw"] 

Если вы не хотите "не":

str.scan(r) - ["not"] 
    #=> ["drs", "tep", "tep", "txw"] 

Если это не разовый с alculation, подумайте, может ли формат текста измениться в будущем. Если это возможно, внедрите метод, который, по вашему мнению, будет менее всего требовать изменения после изменения.

Смежные вопросы