Сравнение строк без учета регистра в скриптах
От: Аноним  
Дата: 24.01.09 04:57
Оценка:
Hi all.
Background: есть собственный скриптовый язык, у пользоветеля есть доступ только к выражениям (expression) вроде 'A > B and foo(C, D) = 10'. Есть основной набор типов : числа, строки, даты, операции над ними и функции.

На текущий момент оператор сравнения(=) сравнивает строки с учетом регистра. Возникла необходимость сравнивать без учета регистра (на текущий момент проблема решается с помощью ToUpper/ToLower). Загвоздка в том что это должно выглядеть как можно проще. Придумались такие варианты:

int Compare(string, string, bool ignoreCase)
int CompareNoCase(string, string)
bool Equal(string, string, bool ignoreCase)
bool operator OP (string, string), где OP - некий оператор(какой выбрать ?), 
предназначенный именно для такого сравнения.

Ни один из вариантов особо не нравится:
Compare — все-таки выполняет больше чем просто сравнение,
Новый оператор — неочевидно (или нет?)
Склоняюсь к Equal, но он пересекается с существующим оператором сравнения

Возможно есть другие варианты ? другие имена функций, что-то еще... Сложность реализации второстепенна.

Спасибо.

PS: есть параметры по умолчанию.
Re: Сравнение строк без учета регистра в скриптах
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.01.09 08:41
Оценка:
Здравствуйте, Аноним, Вы писали:

Что касается нового оператора, то в скриптовых языках уже давно есть операторы =, !=, ==, !==, ===, !===. А при желании можно придумать много других
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Сравнение строк без учета регистра в скриптах
От: Аноним  
Дата: 24.01.09 11:28
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


A>Что касается нового оператора, то в скриптовых языках уже давно есть операторы =, !=, ==, !==, ===, !===.

Первые два у меня тоже есть уже давно... Для чего применяются другие (!==, ===, !===) ?

A>А при желании можно придумать много других

Это запросто. Вопрос в читабельности и логичности. Согласитесь, такое не очень понятно: 'Str ^@&@^ "Qwerty"'
Re[3]: Сравнение строк без учета регистра в скриптах
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.01.09 12:22
Оценка:
Здравствуйте, Аноним, Вы писали:

A>>А при желании можно придумать много других

А>Это запросто. Вопрос в читабельности и логичности. Согласитесь, такое не очень понятно: 'Str ^@&@^ "Qwerty"'

http://www.php.net/manual/ru/language.operators.comparison.php
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Сравнение строк без учета регистра в скриптах
От: Mamut Швеция http://dmitriid.com
Дата: 24.01.09 20:07
Оценка:
А>Склоняюсь к Equal, но он пересекается с существующим оператором сравнения

EqualNoCase
... << RSDN@Home 1.2.0 alpha 4 rev. 1136>>


dmitriid.comGitHubLinkedIn
Re: Сравнение строк без учета регистра в скриптах
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.01.09 00:05
Оценка:
Здравствуйте, Аноним, Вы писали:

Я подумал, оператором нельзя. Помимо строк, есть ещё и язык, в рамках которого мы считаем конкретными символы разными регистрами одной буквы.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Сравнение строк без учета регистра в скриптах
От: Alexander G Украина  
Дата: 25.01.09 10:45
Оценка: +1
Здравствуйте, Аноним, Вы писали:

A>>А при желании можно придумать много других

А>Это запросто. Вопрос в читабельности и логичности. Согласитесь, такое не очень понятно: 'Str ^@&@^ "Qwerty"'

a ^= b /* uppercase comparsion */
a v= b /* lowercase comparsion */


Русский военный корабль идёт ко дну!
Re[4]: Сравнение строк без учета регистра в скриптах
От: Кодт Россия  
Дата: 30.01.09 13:40
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>
AG>a ^= b /* uppercase comparsion */
AG>a v= b /* lowercase comparsion */
AG>


Тогда лучше =\ (lowercase), =/ (uppercase), !=\, !=/ — чтобы не мешать буквы с пунктуацией.
Кстати, в некоторых языках ввести свои операторы — раз плюнуть. Пролог, Хаскел, я уже молчу про Форт и Лисп.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[2]: Сравнение строк без учета регистра в скриптах
От: Кодт Россия  
Дата: 30.01.09 13:40
Оценка:
Здравствуйте, adontz, Вы писали:

A>Я подумал, оператором нельзя. Помимо строк, есть ещё и язык, в рамках которого мы считаем конкретными символы разными регистрами одной буквы.


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

Вот если окажется, что есть слишком много разных (часто используемых) вариантов сравнения, да ещё выбираемых в рантайме — то конечно, на всех их не напасёшься инфиксных операторов.
Тут уже функции с дополнительными аргументами будут рулить.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: Сравнение строк без учета регистра в скриптах
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.01.09 15:41
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ну, какая разница — инфиксная или префиксная запись вызова.

К>И пусть поведение зависит от глобальных настроек.
К>Ведь в конечном счёте не программист для языка, а язык для программиста. Если удобно, что поведение оператора сравнения текстов зависит от локали — так тому и быть.
К>В перле же, например, не поленились затащить регекспы глубоко в синтаксис.

Практика показывает, что такое использование глобальных настроек, а именно наличие неявной зависимости от них, приводит к созданию программ класса "Works on my machine only".
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Сравнение строк без учета регистра в скриптах
От: ekamaloff Великобритания  
Дата: 30.01.09 16:47
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>
AG>a ^= b /* uppercase comparsion */
AG>a v= b /* lowercase comparsion */
AG>


А что, результат "uppercase comparison" и "lowercase comparison" может быть разный?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[5]: Сравнение строк без учета регистра в скриптах
От: Кодт Россия  
Дата: 31.01.09 08:51
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>А что, результат "uppercase comparison" и "lowercase comparison" может быть разный?


В принципе, да. Например, в греческом языке есть одна заглавная сигма Σ и две строчных (концевая ς и не-концевая σ ). А в немецком — строчный эсцет ß, которому соответствуют заглавные SS или SZ.
Перекуём баги на фичи!
Re[4]: Сравнение строк без учета регистра в скриптах
От: Кодт Россия  
Дата: 31.01.09 08:55
Оценка:
Здравствуйте, adontz, Вы писали:

A>Практика показывает, что такое использование глобальных настроек, а именно наличие неявной зависимости от них, приводит к созданию программ класса "Works on my machine only".


О, это повсеместно. Достаточно заложиться на текущую локаль. И даже явно её указать — например, микрософтовские алиасы кодировок CP_ACP, CP_OEM.
Перекуём баги на фичи!
Re[4]: Сравнение строк без учета регистра в скриптах
От: Кодёнок  
Дата: 31.01.09 10:06
Оценка: +1
Здравствуйте, Alexander G, Вы писали:

AG>a ^= b /* uppercase comparsion */

AG>a v= b /* lowercase comparsion */

Фу, еще больший отстой, чем метод CompareNoCase.

В С++ я сделал так:

if (nickname == IgnoreCase(id))

Даже студенты-стажеры, понятия не имеющие как это работает, понимают и применяют без единого вопроса.

По крайней мере в питоне точно можно вернуть такой же временный объект, реагирующий на оператор сравнения и вызывающий что надо. Многие хорошие скрипты и нескрипты тоже должны такое позволять.
Re: Сравнение строк без учета регистра в скриптах
От: Аноним  
Дата: 14.02.09 21:23
Оценка:
Оператор <arg1> = <arg2> nocase:

if a = b nocase
{
    ...
}


if a = b nocase then

    ...


Оператор equals_nocase или equals nocase

if a equals_nocase b


if a equals nocase b
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.