Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21

Поиск в строках массива текста вне зависимости от используемой раскладки

10.06.2019, 09:13. Показов 4353. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ситуация такая: пользователю дана возможность в textBox вводить данные.
Необходимо осуществить поиск этих данных в строках массива.
Особенность вот в чем: пользователь может вводить свои данные как на русском, так и на английском. Например, BX4850 на английской раскладке аналогично тому на выглядит ВХ4850 на русской раскладке. То, в каком виде в строке массива содержится подобное значение неизвестно. Строка массива может как в русской раскладке содержать такую запись, так и в английской. Но нужно все равно выдать эту строку, если найдено подобное совпадение. То есть, по хорошему, должно быть все равно на то, с использованием какой раскладки пользователь укажет свои данные. Нужно все равно выдать ему все возможные варианты для дальнейшего потом отбора им из списка тех, что на самом деле нужны.
Помогите на С# реализовать подобное.

Есть такой вариант с использованием регулярных выражений. Но он с русским текстом не хочет работать. Если я просто в pattern передаю значение из textBox'а, то результат поиска нулевой.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public string[] arrayNeedsRows(string[] arrayRows, string date, string analisis)
        {
            List<string> listNeedsRows = new List<string>();
            string pattern = "[A-Z0-9]+"; //Шаблон поиска
            for (int i = 0; i < arrayRows.Length; i++)
            {
                Regex reg = new Regex(pattern);
                bool match = reg.IsMatch(arrayRows[i]);
                if (match)
                {
                    listNeedsRows.Add(arrayRows[i]); //Пишем нужные строки в список
                }
            }
            string[] arrayNeedsRows = listNeedsRows.ToArray(); //Преобразовываем в массив список строк
            return arrayNeedsRows;
        }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2019, 09:13
Ответы с готовыми решениями:

Считывание нажатия клавиш вне зависимости от раскладки
typedef{int x; int y;} crd; int control(crd *playerCrd) { switch(getch()) { case 87: /*должна быть W*/ ...

Изменение символов текста в зависимости от раскладки
Хочу написать программу которая переводит текст, ошибочно написанный в неправильной раскладке, в правильную. Этот вопрос поднимался здесь...

Поиск городов из списка вне зависимости от регистра
Написать приложение, позволяющее хранить список городов России. Помогите реализовать следующее: Разницы между большими и маленькими...

26
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 09:31
Re_L Mayer, тут нужно уточнить важный момент: строка сформирована или чисто на русском языке или чисто на английском, но не в перемешку? Тогда решение сводится к тому, что мы сначала ищем совпадения в текущем варианте, потому преобразовываем строку в альтернативный и ещё раз ищем.

Такие преобразования придётся делать руками. Заводить таблицу\таблицы проецирования символов одной раскладки на другую.

Если массив строк будет большим, то эффективнее использовать ассоциативные контейнеры (Dictionary, SortedDictionary). Не пытайтесь решить эту задачу регулярными выражениями. Это не волшебная палочка на каждый чих.
0
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 10:13  [ТС]
ВХ-2916
УГ3И
01
ВХ 2816
УГ4И
2ФМ-4
2-506

Это пример того, что может содержаться в строках.

Добавлено через 6 минут
Сама строка может содержать в себе как и русский, так и английский текст.

Проще говоря, есть куча безобразного чего-то. Эту кучу нужно разобрать и найдя что-то удовлетворяющее запросам пользователя - выдать ему.

И массив строк будет большим. Очень большим.

Добавлено через 3 минуты
Просто все, что касается текста на английском криво-косо у меня получается придумать как регулярками найти в строке. Но как только дело доходит до того, что нужно еще по русскому тексту отбирать - тут регулярки и подводят.

Приблизительно так выглядят строки массива.
07061609101216081NJ B2010 Fe-102 ВХ 2816 5-1075-2 1 203504 1 028C 0.198929 Si 0.266017 Mn 0.018393 Al_sol 0.294912 01№ Пробы 013
07061609101216191NJ B2010 Fe-102 УГ4И 1 203504 1 028C 0.518270 Si 2.135885 Mn 0.003682 Al_sol 0.022410 01№ Пробы 013
06881609101221521NJ B2010 Fe-601 2ФМ-4 027C 0.158004 Si 0.877650 Mn 0.078082 Fe 70.26136301№ Пробы ТР 2
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 10:15
Re_L Mayer, тогда рекомендую хранить это безобразие в Dictionary. Завести свой Comparer, который будет считать хеш строки игнорируя "раскладку" символов и сравнивать эти строки так же игнорируя раскладку.

Регулярки тут вообще мимо.
1
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 10:27  [ТС]
Если можно, то поделитесь, пожалуйста, примером решения какой-либо задачи с использованием этого.
Про словари читала информацию. Но примеров мало. Не совсем понимаю как их юзать. И что за Comparer? Быть может у Вас на него найдется пример...
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 10:49
Лучший ответ Сообщение было отмечено Re_L Mayer как решение

Решение

Re_L Mayer, идея в том, чтобы сравнивать строки вне зависимости от их языка. Класс Dictionary подходит для хранения и быстрого поиска в нём. Comparer - класс, который словарь будет использовать для поиска строк в себе. Для его передачи в словарь есть отдельный конструктор.

Вам нужно написать такой компарер, который для строк "QWE" и "ЙЦУ" выдаст одинаковый хеш и при их сравнении ответит TRUE.
1
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 10:51  [ТС]
Спасибо. Идея понятна.
Буду разбираться с инструментами, что Вы предложили.
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 10:55
Re_L Mayer, учтите, что конкретно в такой ситуации Dictionary, при попытке добавить в него строку "QWE" выбросит исключение, если в нём уже есть семантически эквивалентная строка "ЙЦУ".

Способов реализации вашей задачи может быть несколько. Я предложил самый простой вариант.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.06.2019, 11:25
Если массив большой и поиск производится много раз, то я бы при чтении этого массива один раз нормализовал все записи, приведя их к одному языку и потом перед каждым поиском так же нормализовывал бы введенное пользователем значение.
После чего уже можно производить поиск по-нормальному.
1
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 11:30  [ТС]
Спасибо за предложенный вариант. Но не думаю, что для меня это вариант решения. Ибо перебирать каждый элемент строки. Определять то на каком он языке и переводить его в удобный - это долго. Да к тому же не всем русским буквам можно эквивалент в английском языке найти и наоборот.
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 11:39
Цитата Сообщение от Re_L Mayer Посмотреть сообщение
Да к тому же не всем русским буквам можно эквивалент в английском языке найти и наоборот.
Всем до единой есть эквивалент. На клавиатуру посмотрите. Или тут речь не об ошибочно выбранной раскладке, а уже о транслите каком-то?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.06.2019, 11:41
Цитата Сообщение от Re_L Mayer Посмотреть сообщение
Ибо перебирать каждый элемент строки. Определять то на каком он языке и переводить его в удобный - это долго.
Что-то мне подсказывает, что вам так и так придется это делать — в той же реализации предложенного IComparer.
Выбор в том, делать ли это один раз при загрузке всего массива или каждый раз при поиске.
0
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 12:26  [ТС]
Оно то да, понятно. Что разбирать придется. Просто заменить не все можно на то, что удобно. Это бОльшая проблема. Если б можно было, то проблемы то и не было... сразу бы взялась за конвертирование в нужный язык.
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 12:34
Re_L Mayer, почему не возможно? Если исходные данные не возможно, то при загрузке приложения их копию в нужном виде?
0
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 12:43  [ТС]
Допустим мне английская раскладка предпочтительнее..Потому ВХ-2916 из русской раскладки в исходнике я переведу в английскую в его копии. Но как быть с УГ3И, 2ФМ-4 и прочим подобным? Удобную английскую раскладку мне в этом случае не использовать.

Или просто я не совсем понимаю попытки еще один способ решения моей задачи мне объяснить.
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 13:14
Цитата Сообщение от Re_L Mayer Посмотреть сообщение
Но как быть с УГ3И, 2ФМ-4 и прочим подобным?
А это всё чем-то отличается от ВХ-2916 ?
0
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 13:22  [ТС]
Раскладкой. Возможно.
Если я у себя в строке встречу УГ3И, 2ФМ-4 то вопросов нет на счет языка. И если пользователю нужна именно эта строка где есть этот текст, то он только на русском и сможет написать свой запрос. А если у меня в строке ВХ-2916 - то тут вопрос на русском это или английском написано. Можно определить, да. Но я хочу добиться следующего... чтобы даже если пользователь введет ВХ-2916 на русском, а у меня в строке на английском есть ВХ-2916, то выдать эту строку.
0
Эксперт .NET
 Аватар для Usaga
14308 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,410
10.06.2019, 13:31
Re_L Mayer, и? Вам уже сказали как это сделать: насильно переводить в один язык.

Добавлено через 4 минуты
Если вы будете использовать Dictionary или HashSet, то такое приведение вы будете делать в обязательном порядке, чтобы рассчитать хеш ключа.
0
 Аватар для Re_L Mayer
0 / 0 / 1
Регистрация: 19.12.2013
Сообщений: 21
10.06.2019, 14:32  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
я бы при чтении этого массива один раз нормализовал все записи, приведя их к одному языку
Я на это говорила, что не вижу смысла делать. Смысл мне все перелопачивать в какой-то один язык как предлагает данный товарищ.

А вашу идею прописать с помощью словаря варианты замены одних букв другими я приняла. И изучаю сейчас этот вопрос.
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
10.06.2019, 14:36
получается, в основном текст на русском, но могут попадаться и англ. буквы, при их одинаковом начертании?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2019, 14:36
Помогаю со студенческими работами здесь

Поиск и замена текста в строках без учета регистра
Доброе утро задача: есть огромный текст(почти книга). нужно заменить на определенный текст (который в keys) не учитывая регистр. ...

Поиск в строках массива
Задача - найти кол-во элементов в одной строке двумерного массива. Элементы известны заранее. Т.е. есть двумерный массив из 1 столбца и n...

Получить символ с клавиатуры в зависимости от текущей раскладки
Всем привет. Возник вопрос, как получить символ с клавиатуры (текущей раскладки) ? Вот всё что у меня получилось, но это гавнокод :) ...

Поиск елемента 2-хмерного массива который встречается во всех строках
Задан целочисненный двухмерный массив A, каждая строка этого массива упорядочена по возрастанию т.е. A &lt; A. Найти и Вывести на екран...

Поиск элемента массива, который является наибольшим из минимальных отрицательных чисел расположенных в строках
Задан числовой массив А. Составить программу поиска элемента массива, который является наибольшим из минимальных отрицательных чисел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru