Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / хочу просто списать, как проверить строку / 25 сообщений из 32, страница 1 из 2
21.04.2020, 17:21
    #39949480
yemets63
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу просто списать, как проверить строку
свалилось как снег на голову в середине лета,
подскажите пжл.

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

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

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

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

достаточно цикла с Copy
или
цикла с Copy и Delete
...
Рейтинг: 0 / 0
21.04.2020, 19:41
    #39949597
X11
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
21.04.2020, 20:18
    #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
21.04.2020, 20:23
    #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
21.04.2020, 20:27
    #39949623
bk0010
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу просто списать, как проверить строку
В Delphi7 был Unit masks c типом TMask, попробуйте загнать туда ваши слово1*слово2
...
Рейтинг: 0 / 0
21.04.2020, 20:36
    #39949630
хочу просто списать, как проверить строку
bk0010,

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

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


Нужно читать справку, т.к. у некоторых хелперов есть зависимость от регистра и от кодировки.
...
Рейтинг: 0 / 0
21.04.2020, 22:56
    #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
22.04.2020, 11:54
    #39949932
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
хочу просто списать, как проверить строку
X11
ВсеРазумный
А я подумал чем это отличается от POS, в итоге ничем


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

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

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

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

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

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

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


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

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



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

xxx03034035xxxx

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

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

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


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

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

И цитирую -

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

xxx03034035xxxx

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

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

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

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

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

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

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


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

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

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

Тут скорее нужно уточнять префикс-суффикс -
если их не должно быть, то никаких Pos и copy
вообще не нужно, достаточно одного (или двух)
циклов с посимвольным сравнением.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
22.04.2020, 15:09
    #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
22.04.2020, 15:24
    #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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / хочу просто списать, как проверить строку / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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