2015-05-20 8 views
0

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

str = 
"this is some text 

[email protected]: 4444 
some text 
    text @ 7789348 : 666,555 
some text 
" 

Выход:

"7789347", " 4444" 
"7789348", " 666,555" 

Я использую следующее регулярное выражение:

(\s)*[t|T][e|E][x|X][t|T](\s)*@(\s)*(\d)*(\s)*:.* 

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

+0

ли вы имеете в виду 'Я не знаю, как получить matches' ? – max

ответ

1

В случае, если вы должны соответствовать только плавающие цифры, вы можете использовать регулярные выражения: /(?mi)^\s*\btext\b.*[email protected]\s*(\d+(?:,\d+)?)\s*:\s*(\d+(?:,\d+)?)$/

str="""this is some text 

[email protected]: 4444 
some text 
    text @ 7789348 : 666,555 
some text 
""" 
puts str.scan(/(?mi)^\s*\btext\b.*[email protected]\s*(\d+(?:,\d+)?)\s*:\s*(\d+(?:,\d+)?)$/) 

Выход из the demo:

7789347 
4444 
7789348 
666,555 
+0

Спасибо за ответ. невозможно ли совместить полную строку в формате «Текст @ 7789347: 4444» с использованием регулярного выражения, чем извлекать из нее значение 7789347 и 4444 вместо простого разбора цифр? Может быть другой экземпляр, который может содержать цифры без «Текст» в начале строки. – neo

+0

Вы все еще хотите извлечь только цифры, не так ли? Только абзац должен начинаться с «Текст»? Но что такое конечный разделитель? –

+0

Не зная, где остановиться, зная только начальный разделитель, это не поможет. –

1

Вы можете scan это следующим образом:

str.each_line{ |line| 
    a = line.scan(/@(.*):(.*)$/) 
    puts a[0].inspect if !a.empty? 
} 
# ["7789347", " 4444"] 
# [" 7789348 ", " 666,555"] 
+0

Спасибо Shivam. невозможно совместить полную строку с использованием регулярного выражения в вопросе, а затем извлечь значение. – neo

+0

Да, это возможно, но этот подход намного чище. – shivam

1

Чтобы получить значения, которые вы можете использовать: @\s*(.*?)\s*:\s*(\d+(?:,\d+)*)

if line =~ /@\s*(.*?)\s*:\s*(\d+(?:,\d+)*)/ 
    match1 = $~[1] 
    match2 = $~[2] 
else 
    match = "" 
end 
Смежные вопросы