powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / хочу просто списать, как проверить строку
32 сообщений из 32, показаны все 2 страниц
хочу просто списать, как проверить строку
    #39949480
yemets63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
свалилось как снег на голову в середине лета,
подскажите пжл.

нужно сделать сравнение функциями delphi

часть текстовой строки известна, часть нет
типа так

(словоХХХХХХ = словопроверки) = true
главное для проверки - слово
продолжение после слово не важно
pos('слово', строка) - не то.

(словоХХХХХХслово2 = словопроверкислово2) = true
главное для проверки - слово в начале и слово2 в конца, середина не важно
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949501
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63,

достаточно цикла с Copy
или
цикла с Copy и Delete
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949597
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть же строковые хелперы (System.SysUtils.TStringHelper) , типа compare, Contains

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
var
  MyString, ContainedString: String;

begin
  MyString := 'This is a string.';
  ContainedString := 'This';
  Writeln(Boolean(MyString.Contains(ContainedString)));
end.



http://docwiki.embarcadero.com/Libraries/Rio/en/System.SysUtils.TStringHelper.Contains
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949615
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var
  StrText, StrCmp: string;
  LenStr, LenCmp: Cardinal;
  IsCmp: Boolean;

begin
  StrText := 'словоХХХХХХслово2';
  StrCmp := 'слово';
  LenStr := Length(StrCmp);
  LenCmp := LenStr * 2;

  IsCmp := CompareMem(@StrCmp[1], @StrText[1], LenCmp)
        or CompareMem(@StrCmp[1], @StrText[Length(StrText) - LenStr], LenCmp);

  Writeln(IsCmp);

  Readln;
end.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949620
X11,
А я подумал чем это отличается от POS, в итоге ничем

Код: pascal
1.
2.
3.
4.
function TStringHelper.Contains(const Value: string): Boolean;
begin
  Result := System.Pos(Value, Self) > 0;
end;
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949623
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Delphi7 был Unit masks c типом TMask, попробуйте загнать туда ваши слово1*слово2
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949630
bk0010,

А банально сравнить строку в начале, и потом с конца : Строка[(Длина строки - длина слова проверки)] = слова

Вообще не вариант? Без всяких copy
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949694
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
А я подумал чем это отличается от POS, в итоге ничем


Нужно читать справку, т.к. у некоторых хелперов есть зависимость от регистра и от кодировки.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949747
X11,

Да это обычная обвязка стандартных функций. Как не малюй, а все вызовы будут аналогичны к чистому API в зависимости от типа.

Вообще, в принципе очень скудный и примитивный механизм, не предназначенный для многофункциональности.

Ну если хочется по фантазировать


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function CmpBeginAndEndVal(const Value, str: WideString; Locale: LCID = LOCALE_USER_DEFAULT; CmpFlags: DWORD = NORM_IGNORECASE): Boolean;
var
  len1, len2: Integer;
begin
  len1 := Length(Value);
  len2 := Length(str) - len1;
  Result := CompareStringW(Locale, CmpFlags, PWideChar(Value), len1, PWideChar(str), len1) = CSTR_EQUAL;
  Result := Result or (CompareStringW(Locale, CmpFlags, PWideChar(Value), len1, PWideChar(@str[len2]), len1) = CSTR_EQUAL);
end;

begin
  Writeln(CmpBeginAndEndVal('словО', 'соОвоХХХХХХСлоВо2'));
  Readln;

end.



CompareStringW Не учитывает регистр, умеет сравнивать однобайтовые символы с двухбайтовыми. Ой много чего.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949932
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
ВсеРазумный
А я подумал чем это отличается от POS, в итоге ничем


Нужно читать справку, т.к. у некоторых хелперов есть зависимость от регистра и от кодировки.

UpperCase/LowerCase не проканает?

зы. я бы тоже использовал старый добрый Pos() :)
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949946
Док,

Это всё хорошо, если бы не одно Но. ТЗ - "Слово" должно находится либо в начале, либо в конце текста.

А вот pos ты не отрегулируешь длину поиска (Потому что авторы, не додумались что можно было бы и добавить пункт maxlen)
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949949
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный> Потому что авторы, не додумались что можно было бы и добавить пункт maxlen)

Зачем maxlen? Наоборот, startfrom.
И для этого есть другие функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949954
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
И для этого есть другие функции.

PosEx
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949962
wadman
PosEx


А тебя не смущает что это всё та же Pos ? Да даже по аргументам, тебя это должно было натолкнуть. Я даже вот с сорцы не буду лезть и проверять это.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949963
Гаджимурадов Рустам

Зачем maxlen? Наоборот, startfrom.
И для этого есть другие функции.



Затем, что бы иметь возможность искать текст, в определённом участке текста.

xxx03034035xxxx

То есть, offset = 3 и maxlen = 8
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949964
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
А тебя не смущает что это всё та же Pos ?

Читай чуть выше:
Гаджимурадов Рустам
Зачем maxlen? Наоборот, startfrom.
И для этого есть другие функции.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949966
wadman
ВсеРазумный
А тебя не смущает что это всё та же Pos ?

Читай чуть выше:
Гаджимурадов Рустам
Зачем maxlen? Наоборот, startfrom.
И для этого есть другие функции.


Затем, что ты startFrom можешь указать и через @str[3] А вот MaxLen ты никак не укажешь.

Какие другие функции CompareStringW ?

И цитирую -

ВсеРазумныйЗатем, что бы иметь возможность искать текст, в определённом участке текста.

xxx03034035xxxx

То есть, offset = 3 и maxlen = 8
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949968
Я же говорю, весь стоковый функционал - дубовый. Он вам даёт ровно - то, что вы можете сделать и без него.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949972
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman> PosEx

Да их тьма, от требований и используемых либ зависит. *StrPos опять же.

ВсеРазумный> Затем, что бы иметь возможность искать
ВсеРазумный> текст, в определённом участке текста.

Это довольно редкая необходимость, к сабжу не относится.
Но да, в условном StringFundamentals должно быть четвёртым
необязательным параметром.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949974
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Затем, что ты startFrom можешь указать и через @str[3] А вот MaxLen ты никак не укажешь.

С таким подходом подойдет и Copy.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949981
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну он тебе ответит, что Copy неэффективен по скорости и памяти.

В условно-идеальной функции должны быть (s, template, from, to, options),
последние три - необязательные, пятый может быть множеством или
набором параметров - case/ai, charset/locale/collate и пр.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949987
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63

(словоХХХХХХслово2 = словопроверкислово2) = true
главное для проверки - слово в начале и слово2 в конца, середина не важно


Насколько длинные части в начале и в конце должны совпадать, чтобы результат подходил?
1 символ, 2, 5?..
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39949997
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> Насколько длинные части в начале и в конце должны совпадать

Насколько я понял, они должны не совпадать, а просто присутствовать.

Например, для 'qwertyXXXXXabcdYYYYYYY' -
слово1 и слово2 это qwerty и abcd.

Тут скорее нужно уточнять префикс-суффикс -
если их не должно быть, то никаких Pos и copy
вообще не нужно, достаточно одного (или двух)
циклов с посимвольным сравнением.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950025
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
yemets63
свалилось как снег на голову в середине лета,
подскажите пжл.

нужно сделать сравнение функциями delphi

часть текстовой строки известна, часть нет
типа так

(словоХХХХХХ = словопроверки) = true
главное для проверки - слово
продолжение после слово не важно
pos('слово', строка) - не то.

(словоХХХХХХслово2 = словопроверкислово2) = true
главное для проверки - слово в начале и слово2 в конца, середина не важно



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function FF(const aTmpl, aSrc: string): Boolean;
var
  fpTB, fpTE: PChar;
  fpSB, fpSE: PChar;
begin
  Result := True;
  if aTmpl = '' then Exit;

  fpTB := PChar(aTmpl);
  fpTE := fpTB + Pred(Length(aTmpl));

  fpSB := PChar(aSrc);
  fpSE := fpSB + Pred(Length(aSrc));

  while ((fpSB^ = fpTB^) or (fpSE^ = fpTE^)) and (fpTB <> fpTE) do begin

    if fpSB^ = fpTB^ then begin
      Inc(fpSB);
      Inc(fpTB);
    end;

    if fpTB <> fpTE then
      if fpSE^ = fpTE^ then begin
        Dec(fpSE);
        Dec(fpTE);
      end;

  end;

  Result := (fpSB^ = fpTB^) or (fpSE^ = fpTE^)


end;

begin
  Assert(FF('', '123'));
  Assert(not FF('123', ''));
  Assert(FF('13', '1**************3'));
  Assert(FF('3', '123'));
  Assert(FF('123', '123'));
  Assert(FF('13', '123'));
  Assert(FF('', 'Рыба не ловится в зимней реке'));
  Assert(FF('Рыба', 'Рыба не ловится в зимней реке'));
  Assert(FF('реке', 'Рыба не ловится в зимней реке'));
  Assert(FF('Рыба в зимней реке', 'Рыба не ловится в зимней реке'));
  Assert(not FF('Рыба в реке', 'Рыба не ловится в зимней реке'));
  Assert(FF('Ре', 'Рыба не ловится в зимней реке'));
  Assert(FF('Рыке', 'Рыба не ловится в зимней реке'));
  Assert(FF('е', 'Рыба не ловится в зимней реке'));
  Assert(FF('Рыба не ловится в зимней реке',    'Рыба не ловится в зимней реке'));



end.


...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950031
Гаджимурадов Рустам,

Облазил Delphi и выяснил что из всего набора, на это способны функции из SysUtils

WinAPI - CompareString
function AnsiStrLComp\AnsiStrLIComp(S1, S2: PAnsiChar\PWideChar; MaxLen: Cardinal): Integer;


Встроенные в Delphi
function StrLComp\StrLIComp(const Str1, Str2: PAnsiChar\PWideChar; MaxLen: Cardinal): Integer;

Ещё есть StrPosLen которая использует StrLComp Но не доступной для пользователя
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function StrPosLen(const Str1, Str2: PWideChar; Len1, Len2: Integer): PWideChar;
var
  I: Integer;
begin
  Result := nil;
  if Len1 = 0 then
    Exit;
  if Len2 = 0 then
    Exit;
  for I := 0 to Len1 - Len2 do
  begin
    if (Str1[I] <> #0) and (StrLComp(PWideChar(PByte(Str1) + I * SizeOf(WideChar)), Str2, Len2) = 0) then
    begin
      Result := PWideChar(PByte(Str1) + I * SizeOf(WideChar));
      Exit;
    end;
  end;
end;




В общем то на этом и всё. Скорее где то ещё есть похожий функционал в модулях.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950073
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
yemets63,
а что, regex-ов в вашем дельфи нет? точно? (а если найду??)

"словоХХХХХХ" - откуда берутся иксы, это юзер их вводит?
их число имеет значение (каждый - 1 буква)?

наверное, можно искомое слово разбить на куски (ваши иксы как разделитель, если вы понимаете, как их распознать) и искать их по порядку - каждый следующий начиная с позиции "позиция найденного предыдущего + его длина + 1 (или число иксов)" (PosEx)
(это если я угадал смысл кривоватого ТЗ и начало с концом строки не являются частью искомого - или являются?)

в любом случае, regex-ы рулят.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950080
L1G
а что, regex-ов в вашем дельфи нет? точно? (а если найду??)


Есть конечно, полноценный сишный - http://docwiki.embarcadero.com/Libraries/Rio/en/System.RegularExpressions.TRegEx

L1G

"словоХХХХХХ" - откуда берутся иксы, это юзер их вводит?


Я предполагал это неизвестный текст.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950200
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Я предполагал это неизвестный текст.
Неизвестный текст нельзя ввести в комьпютер :(
(а программа может работать только с тем, что есть в компьютере)
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950203
L1G,

Кто сказал, что кто - то вводит, что - то в ручную? Данные скорее всего, прилетают откуда - то. Или так хранятся.

В общем, для программы эти X - неизвестность, тем более для человека. Да - они загружены в память, это определённо. Но их не надо анализировать.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950219
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
alekcvp> Насколько длинные части в начале и в конце должны совпадать

Насколько я понял, они должны не совпадать, а просто присутствовать.

Например, для 'qwertyXXXXXabcdYYYYYYY' -
слово1 и слово2 это qwerty и abcd.


Из его текста и описания, я понял что подходит всё что совпадает в начале или в начале и в конце. Тогда это вообще проверяется элементарно через StartsWith() и EndsWith() и не надо тут велосипед городить. А может вообще достаточно первый и последний символы двух строк сравнить?.. Отсюда и вопрос про минимальное количество совпадающих символов в словах.
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39950225
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp
Гаджимурадов Рустам
alekcvp> Насколько длинные части в начале и в конце должны совпадать

Насколько я понял, они должны не совпадать, а просто присутствовать.

Например, для 'qwertyXXXXXabcdYYYYYYY' -
слово1 и слово2 это qwerty и abcd.


Из его текста и описания, я понял что подходит всё что совпадает в начале или в начале и в конце. Тогда это вообще проверяется элементарно через StartsWith() и EndsWith() и не надо тут велосипед городить. А может вообще достаточно первый и последний символы двух строк сравнить?.. Отсюда и вопрос про минимальное количество совпадающих символов в словах.


ТС смотрит и хихикает, радостно потирает лапки...
...
Рейтинг: 0 / 0
хочу просто списать, как проверить строку
    #39951099
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
ТС смотрит и хихикает, радостно потирает лапки...
+1 Криво сформулированный вопрос не содержит в себе половину ответа))
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / хочу просто списать, как проверить строку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]