2013-09-23 5 views
1

я есть «3 х 1» массив ячеек, содержимое которых появляются как следующие:Matlab Извлечение подстрока из массива ячеек

'ASDF_LE_NEWYORK Fixedafdfgd_ML' 
'Majo_LE_WASHINGTON FixedMonuts_ML' 
'Array_LE_dfgrt_fdhyuj_BERLIN Potato Price' 

Я хочу, чтобы иметь возможность элегантно экстракте и создать еще один «3x1» массив ячеек с содержимым, как:

'NEWYORK' 
'WASHINGTON' 
'BERLIN' 

Если вы заметили в выше NAME являются после последнего подчеркивания и перед первым пробел или «_ML». Как написать такой код в сжатой форме.

Благодаря

Edit:

К сожалению, ребята, я должен использовать лучший пример. Теперь я исправил это.

+0

Названия * не * после последнего подчеркивания, по крайней мере, не в первых двух записях. – jedwards

+0

Я обновил свой ответ, чтобы получить результат в запрошенном формате. – chappjc

ответ

2

Вы можете использовать для просмотра назад _ и опережающего просмотра для пространства:

names = regexp(A, '(?<=_)[^\s_]*(?=\s)', 'match', 'once'); 

Где A это массив ячеек, содержащие строки:

A = {... 
'ASDF_LE_NEWYORK Fixedafdfgd_ML' 
'Majo_LE_WASHINGTON FixedMonuts_ML' 
'Array_LE_dfgrt_fdhyuj_BERLIN Potato Price'}; 

>> names = regexp(A, '(?<=_)[^\s_]*(?=\s)', 'match', 'once') 
names = 
    'NEWYORK' 
    'WASHINGTON' 
    'BERLIN' 
+0

Он работает. Но не могли бы вы объяснить, как это прочитать: «(? <= _) [^ \ S _] * (? = \ S) '? – Zanam

+0

'(? <= _)' Ищет '_' перед соответствующей строкой, но не включает ее в соответствие, а' (? = \ S) 'ищет пробел после соответствия строки и не включает его в совпадении, а строка соответствия - '[^ \ s _] *', означающая последовательность непространственных, не-подчеркивающих символов. См. Http://www.regular-expressions.info/lookaround.html для получения дополнительной информации. –

1

ПРИМЕЧАНИЕ: вопрос был изменен, поэтому ответ больше не завершен, но, надеюсь, пример regexp по-прежнему полезен.

Попробуйте regexp как это:

names = regexp(fullNamesCell,'_(NAME\d?)\s','tokens'); 
names = cellfun(@(x)(x{1}),names) 

В шаблоне _(NAME\d?)\s, скобки определяют подвыражению, который будет возвращен в знак (, часть согласованного текста). \d? указывает ноль или одну цифру, но вы можете использовать \d{1} для ровно одной цифры или \d{1,3}, если вы ожидаете от 1 до 3 цифр. Указанный пробел \s.

Реорганизация names немного запутанна, но когда вы используете регулярное выражение с вводом ячеек и tokens, вы получаете ячейку ячеек, которая нуждается в переформатировании для ваших целей.

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