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

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

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

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

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

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

Откуда: Kharkiv, Ukraine
Сообщений: 12997
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

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

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

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

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

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

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

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

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

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

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


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

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

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


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

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

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

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

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

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

Откуда:
Сообщений: 1367
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
Сообщений: 3227
[quot Фэйтл Эра]
makhaon
пропущено...


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


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

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


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


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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

Откуда: Москва
Сообщений: 1932
_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

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

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

Откуда: Минск
Сообщений: 1388
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

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

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

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


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

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

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

Откуда:
Сообщений: 5004
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

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

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

Откуда: Минск
Сообщений: 1388
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

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

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

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

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

Откуда: Москва
Сообщений: 1932
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

Откуда: Минск
Сообщений: 1388
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 Ответить