2015-03-18 4 views
0

Есть ли встроенная функция в delphi, если строка содержит подстроку, но не в конце?Проверьте, содержит ли строка строку подстроки, но не в конце

Например предположим, у меня есть эти строки:

 
G15001, 
G15005, 
G15015, 
G14015, 
G14004, 
PLU15010, 
PLU14015 

Я хочу вернуться верно, когда строка G15001 G15005, G15015, PLU15010 и подстроку для поиска является 15, но возвращают ложь, когда G14015 или PLU14015, потому что они имеют 15 только в конце.

ответ

5

Используйте Pos, чтобы проверить, есть ли подстрока. Затем проверьте, что подстрока не находится в конце.

function ContainsBeforeEnd(const str, substr: string): Boolean; 
var 
    P: Integer; 
begin 
    P := Pos(substr, str); 
    if P = 0 then 
    // substr not found at all 
    Result := False 
    else 
    // found, now check whether substr is at the end of str 
    Result := P + Length(substr) - 1 <> Length(str); 
end; 
+0

Если используются тяжелым, может быть, он может использовать PosEx, который быстрее и позволяет начать поиск с указанным смещением. – RBA

+2

@RBA Я думаю, что Pos реализован как вызов PosEx. Поиск должен начинаться в начале строки, когда я читаю вопрос. Код также может быть написан с помощью помощников строк. –

+0

В pre-XE3 вы можете использовать 'StrUtils.EndsText()' или 'StrUtils.RightStr()' –

0

Это один лайнер должен дать вам то, что вы хотите:

Pos (подстрока, копия (ул, 1, длина (ул) -1))> 0

решение Давида чище, Но просто хотел сделать 1 лайнер.

0

Больше предложений с акцентом на остротах:

function ContainsBeforeEnd(const str, substr: string): Boolean; 
begin 
    Result := not (Pos(subStr,Str) in [0,Length(str)-Length(subStr)+1]); 
end; 

function ContainsBeforeEnd(const str, substr: string): Boolean; 
begin // Note, string helpers returns results based on zero based strings 
    Result := (Length(str) > Length(subStr) and 
    (str.IndexOf(subStr) in [0..Length(str)-Length(subStr)-1]); 
end;  
Смежные вопросы