Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Как сравнить 2 строки case insensitive ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
Добрый день, какой правильный способ сравнить 2 строки case insansitive ?
Надо что бы
'Папа' = 'папа'

И что бы
'Папааа'+1ГБ <> 'мамааа'+1ГБ

Как использовать IEqualityComparer, и можно ли использовать его тут ?
27 дек 18, 09:52    [21774518]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3958
AnsiCompareText
27 дек 18, 09:56    [21774522]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12671
- Luke, use ToLowerInvariant or ToUpperInvariant to compare case insensitive.


http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.SysUtils.TStringHelper
27 дек 18, 09:57    [21774523]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12671
ShowMessage('TEST'.ToLowerInvariant.Contains('t').ToString(TUseBoolStrs.True));
27 дек 18, 09:57    [21774524]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12671
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_CompareText@string@string.html

CompareText compares S1 and S2 and returns 0 if they are equal. If S1 is greater than S2, CompareText returns an integer greater than 0. If S1 is less than S2, CompareText returns an integer less than 0. CompareText is not case sensitive and is not affected by the current locale.
27 дек 18, 09:59    [21774525]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
JaDi,

Меня пугает слово Ansi в юникоде.
27 дек 18, 10:01    [21774531]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
X11,

Я знал, что предложат использовать что-то ToLower.
Но использовать это нельзя.
Сначала ToLower должна перевести 2 строки по 1ГБ текста в нижний регистр, а потом увидит, что различается первый символ.
27 дек 18, 10:05    [21774535]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24745
Valery_B
Я знал, что предложат использовать что-то ToLower.
Но использовать это нельзя.
Сначала ToLower должна перевести 2 строки по 1ГБ текста в нижний регистр, а потом увидит, что различается первый символ.

Хочешь остановить прогресс? Для чего тогда наращивать гигабайты и гигагерцы?
27 дек 18, 10:26    [21774550]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
wadman
Хочешь остановить прогресс?

Нет. Я хочу сравнить 2 строки между собой.
27 дек 18, 10:31    [21774555]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3007
Valery_B
JaDi,

Меня пугает слово Ansi в юникоде.


Зря. Достаточно один раз кликнуть, что бы реализацию посмотреть.
27 дек 18, 10:35    [21774559]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Фэйтл Эра
Member

Откуда:
Сообщений: 416
[quot makhaon]
Valery_B
JaDi,

Меня пугает слово Ansi в юникоде.


Зря.
ANSI на ASCII похоже, вот и страшно.
27 дек 18, 10:38    [21774562]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29392

27.12.2018 9:52, Valery_B пишет:

> Надо что бы
> 'Папа' = 'папа'

AnsiSameText()

Posted via ActualForum NNTP Server 1.5

27 дек 18, 10:45    [21774569]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1242
Valery_B
X11,

Я знал, что предложат использовать что-то ToLower.
Но использовать это нельзя.
Сначала ToLower должна перевести 2 строки по 1ГБ текста в нижний регистр, а потом увидит, что различается первый символ.

В лоб... переводи посимвольно и сравнивай символы... или чанками...
27 дек 18, 10:47    [21774571]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
alekcvp
Member

Откуда:
Сообщений: 1249
X11
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_CompareText@string@string.html
CompareText compares S1 and S2 and returns 0 if they are equal. If S1 is greater than S2, CompareText returns an integer greater than 0. If S1 is less than S2, CompareText returns an integer less than 0. CompareText is not case sensitive and is not affected by the current locale.


Только лучше AnsiCompareText(), т.к. простой CompareText() (который без LocaleOptions) не-ascii символы сравнивает побайтно.
27 дек 18, 12:03    [21774627]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3007
[quot Фэйтл Эра]
makhaon
пропущено...


Зря.
ANSI на ASCII похоже, вот и страшно.


ANSI и ASCII соотносятся примерно так же, как канал и канализация :)
27 дек 18, 13:33    [21774713]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5142
[quot makhaon]
Фэйтл Эра
пропущено...


ANSI и ASCII соотносятся примерно так же, как канал и канализация :)


+
как гонорея и гонорар
27 дек 18, 14:14    [21774766]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
asviridenkov
Member

Откуда:
Сообщений: 3847
AnsiSameText / AnsiCompareText те еще бомбы замедленного действия
27 дек 18, 14:19    [21774773]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10689
Valery_B
Сначала ToLower должна перевести 2 строки по 1ГБ текста
А вы переводите по 4К
27 дек 18, 15:42    [21774906]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3958
asviridenkov
AnsiSameText / AnsiCompareText те еще бомбы замедленного действия

Если работать с английский/русским текстом будут проблемы когда-нибудь?
27 дек 18, 16:03    [21774932]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
asviridenkov
Member

Откуда:
Сообщений: 3847
JaDi
asviridenkov
AnsiSameText / AnsiCompareText те еще бомбы замедленного действия

Если работать с английский/русским текстом будут проблемы когда-нибудь?


Зависит от локали в системе
27 дек 18, 16:06    [21774938]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3167
JaDi
Если работать с английский/русским текстом будут проблемы когда-нибудь?

Если строки юникодовые то не будет.
27 дек 18, 16:42    [21774984]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29392

27.12.2018 16:06, asviridenkov пишет:
> Зависит от локали в системе

только если сознательно отказаться от MBCS.

Posted via ActualForum NNTP Server 1.5

27 дек 18, 16:55    [21774997]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
rgreat
Member

Откуда:
Сообщений: 4625
Valery_B
Добрый день, какой правильный способ сравнить 2 строки case insansitive ?
Надо что бы
'Папа' = 'папа'

И что бы
'Папааа'+1ГБ <> 'мамааа'+1ГБ

Как использовать IEqualityComparer, и можно ли использовать его тут ?
Если вопрс упирается в быстродействие - сначала сравни длину строк а потом сравнивай их по частям. По 100*(номер итерации) символов, к примеру.
27 дек 18, 17:07    [21775016]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1974
rgreat
Если вопрс упирается в быстродействие - сначала сравни длину строк а потом сравнивай их по частям. По 100*(номер итерации) символов, к примеру.
Нельзя. Строки могут быть одинаковыми при разной длине. Например: Krijshof и Krijshof
27 дек 18, 17:24    [21775032]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
_Vasilisk_
А вы переводите по 4К

rgreat
Если вопрс упирается в быстродействие - сначала сравни длину строк а потом сравнивай их по частям. По 100*(номер итерации) символов, к примеру.

Вопрос - т.е. сравнение case insensitive я должен писать с нуля?

На C# пишется так:
var s = "Всем Привет";
if (s.Equals("всем привет", StringComparison.InvariantCultureIgnoreCase) == true)
    return "equal";
else
    return "not equal";

Результат:
equal
27 дек 18, 17:27    [21775038]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3167
white_nigger,

А кто нормализацию не делает тот ссзб
27 дек 18, 17:28    [21775040]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1242
Valery_B
_Vasilisk_
А вы переводите по 4К

rgreat
Если вопрс упирается в быстродействие - сначала сравни длину строк а потом сравнивай их по частям. По 100*(номер итерации) символов, к примеру.

Вопрос - т.е. сравнение case insensitive я должен писать с нуля?

На C# пишется так:
var s = "Всем Привет";
if (s.Equals("всем привет", StringComparison.InvariantCultureIgnoreCase) == true)
    return "equal";
else
    return "not equal";

Результат:
equal

И в Delphi так можно
var
  b: Boolean;
begin
  b := string.Compare('Папа', 'папа', [TCompareOption.coIgnoreCase]) = 0;
27 дек 18, 17:44    [21775070]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1974
Kazantsev Alexey
А кто нормализацию не делает тот ссзб Картинка с другого сайта.
Не всегда нужно. Про NFKD и NFKC вообще не так много кто знает, а AnsiCompareText справиться с большинством ситуаций. Для экзотики уже пусть играются с флагами CompareStringW и CompareStringEx
27 дек 18, 17:59    [21775089]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
asviridenkov
Member

Откуда:
Сообщений: 3847
Kazantsev Alexey
JaDi
Если работать с английский/русским текстом будут проблемы когда-нибудь?

Если строки юникодовые то не будет.


Зря так думаешь
27 дек 18, 18:02    [21775092]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3167
asviridenkov
Зря так думаешь

Давай пример с проблемами.
27 дек 18, 18:03    [21775095]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
rgreat
Member

Откуда:
Сообщений: 4625
X-Cite
И в Delphi так можно
var
  b: Boolean;
begin
  b := string.Compare('Папа', 'папа', [TCompareOption.coIgnoreCase]) = 0;

Это в итоге вызов CompareString из WinAPI.
27 дек 18, 18:09    [21775098]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3167
rgreat
Это в итоге вызов CompareString из WinAP

AnsiCompare... тоже.
27 дек 18, 18:14    [21775104]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1242
rgreat
X-Cite
И в Delphi так можно
var
  b: Boolean;
begin
  b := string.Compare('Папа', 'папа', [TCompareOption.coIgnoreCase]) = 0;

Это в итоге вызов CompareString из WinAPI.

В C# это выльется в вызов CompareStringEx из WinApi
27 дек 18, 18:20    [21775112]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 374
InternalCompareStringOrdinalIgnoreCase
27 дек 18, 19:12    [21775155]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Gator
Member

Откуда: Москва
Сообщений: 13964
Фигня это всё. Вы опечатки отловите, а Чувствительность к регистру символов дело поправимое
27 дек 18, 19:38    [21775185]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1242
Гирлионайльдо
InternalCompareStringOrdinalIgnoreCase

Это в Mono... Я только что проверил, в консольном приложении на .Net идет вызов CompareStringEx
27 дек 18, 20:04    [21775218]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
X-Cite
string.Compare('Папа', 'папа', [TCompareOption.coIgnoreCase]) = 0;

ок, так у буду делать.
Но сравнение с нулём выглядит как-то не понятно.
X-Cite
В C# это выльется в вызов CompareStringEx из WinApi

Не верное утверждение для .NET
Ты не можешь точно знать, что там он в результате сделает, да это и не нужно знать.
Это зависит от конкретной связки версии ОС + .NET
NET.Core может вызывать другую функцию.
28 дек 18, 09:23    [21775442]     Ответить | Цитировать Сообщить модератору
 Re: Как сравнить 2 строки case insensitive ?  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1242
Valery_B
X-Cite
string.Compare('Папа', 'папа', [TCompareOption.coIgnoreCase]) = 0;

ок, так у буду делать.
Но сравнение с нулём выглядит как-то не понятно.
X-Cite
В C# это выльется в вызов CompareStringEx из WinApi

Не верное утверждение для .NET
Ты не можешь точно знать, что там он в результате сделает, да это и не нужно знать.
Это зависит от конкретной связки версии ОС + .NET
NET.Core может вызывать другую функцию.


.Net Framework 4.5.1 Console Application вызывается CompareStringEx
.Net Core 2.2 Вызывает что-то свое, но активно юзает мультибайтовые winapi

К сообщению приложен файл. Размер - 57Kb
28 дек 18, 14:09    [21775745]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить