Сравнение строк,.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')