Сравнение строк,.NET и свободное пространство
У меня есть приложение, написанное на С#, которое делает много сравнения строк. Строки вытягиваются из разных источников (включая пользовательский ввод) и затем сравниваются. Однако я сталкиваюсь с проблемами при сравнении пространства "32" с неразрывным пространством "160". Для пользователя они выглядят одинаково и поэтому ожидают матча. Но когда приложение выполняет сравнение, совпадения нет.
Каков наилучший способ сделать это? Должен ли я идти ко всем частям кода, которые выполняют сравнение строк и ручно нормализуют неразрывные пробелы в пространствах? Предлагает ли .NET что-нибудь, чтобы помочь с этим? (Я пробовал все варианты сравнения, но никто не помогает.)
Было высказано предположение, что я нормализую строки при получении, а затем пусть метод сравнения строк просто сравнивает нормированные строки. Я не уверен, что это было бы прямолинейно, потому что в первую очередь это нормализованная строка. Что я тоже нормализую? Конечно, на данный момент я могу преобразовать неразрывные пробелы в разбивающие пространства. Но что еще может появиться? Может ли быть очень много из этих правил? Возможно, они даже противоречат друг другу. (В одном случае я хочу использовать правило, а в другом - нет.)
Ответы
Ответ 1
Если бы это был я, я бы "нормализовал" струны, когда я их втянул "; вероятно, со строкой. Replace(). Тогда вам больше не придется менять свои сравнения.
Изменить. Отметьте, что это круто. Это действительно зависит от вас, или от ваших клиентов, от того, что такое "нормализованная" строка. Я был в похожей ситуации, когда клиент требовал, чтобы строки такие:
I have 4 apples.
I have four apples.
были фактически равны. Вам могут потребоваться отдельные нормализаторы для разных ситуаций. В любом случае, я все равно выполнил бы нормализацию после извлечения исходных строк.
Ответ 2
Я нашел много боли, чтобы найти этот простой ответ. В приведенном ниже коде используется регулярное выражение для замены нерасширяющихся пробелов нормальными пробелами.
string cellText = "String with non breaking spaces.";
cellText = Regex.Replace(cellText, @"\u00A0", " ");
Надеюсь, это поможет, Дэн
Ответ 3
Я бы предложил создать свой собственный строковый сопоставитель, который расширяет один из исходных - выполните "нормализацию" там (замените неразрывное пространство на обычное пространство). В дополнение к методу экземпляра Equals
существует статический String.Equals
, который принимает компаратор.
Ответ 4
То же самое без регулярного выражения, в основном для себя, когда это необходимо позже:
text.Replace(' ', '\u00A0')