2014-12-16 5 views
4

Мне нужно сравнить последние символы строк в Matlab. Естественно я бы сделал следующее:Сравнение последних символов строк

string = 'foobar'; 
len_string = length(string); 
if len_str_2 >= 3 
    str_suffix = str_2(len_str_2 - 2:len_str_2); 
    strcmp('bar', str_suffix) 
end 

Есть ли более простой способ сделать это? С strncmp Я могу сравнить только первые n символов.

+0

Это всего лишь один конкретный случай поиска шаблона в строке. В общем, 'regexp' - хороший инструмент для этого. –

ответ

6

Это звучит как типичная работа для регулярного выражения:

any(regexp('foobar','bar$')) %% Will return true 
any(regexp('foobars','bar$')) %% Will return false 

Знак доллара навязывает шаблон, чтобы быть в конце строки.

2

Вы можете использовать end для обозначения последнего символа строки.

string = 'foobar'; 

if length(string) >= 3 
    matches = strcmp('bar', string(end-2:end)) 
end 

Если устранение if утверждение имеет решающее значение, вы можете использовать max, но это, безусловно, кажется, менее желательны мне:

string = 'foobar'; 
search_str = 'bar'; 

matches = strcmp(search_str, string(max(end-length(search_str)+1, 1) 
+0

Лучше, чем мой, но проверка (длина (строка)> 3) по-прежнему требуется. – jonie83

+0

@ jonie83 Добавлена ​​вариация, которая не использует 'if', хотя я думаю, что первая из них все же лучше этих двух, так как код намного читабельнее. – ohruunuruus

2

Вы можете щелкнуть левой к правой string и search string, а затем использовать strncmp -

%// Inputs 
string = 'foobar' 
search_string = 'bar' 

out = strncmp(string(end:-1:1),search_string(end:-1:1),numel(search_string)) 

Мало пробеги образец -

(1) исходной задачи случай

string = 
foobar 
search_string = 
bar 
out = 
    1 

(2) Модифицированный случае с string же как search_string

string = 
bar 
search_string = 
bar 
out = 
    1 

(3) Модифицированный случае с string меньшей длины, чем search_string , для которого у вас был IF условный

string = 
ar 
search_string = 
bar 
out = 
    0 
+0

Красиво сделано. Любая причина использовать как 'string (end: -1: 1)', так и 'fliplr' для двух разных строк? – ohruunuruus

+0

@ohruunuruus На самом деле нет большой причины, но с начальными испытаниями у меня была жесткая кодировка search_string, поэтому был использован fliplr. Отредактировано с помощью '(end: -1: 1)', и это должно сохранить вызов функции 'fliplr' и может быть чуть быстрее. – Divakar

1

Позже Matlab имеет функцию endsWith, но мне потребуется некоторое время, чтобы начать использовать его из-за беспокойства о совместимости.

str = 'foobar'; 
endsWith(str, 'bar') % return logical 1 
+0

FYI, endsWith наряду с несколькими другими новыми текстовыми функциями были добавлены в 16b. – matlabbit

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