Мне нужно сравнить 2 строки как равные, такие как:
Любек == Любек
В JavaScript.
Почему? Ну, у меня есть поле автозаполнения, которое выходит на службу Java с помощью Lucene, где имена мест хранятся естественным образом (как Lübeck), но также индексируются как нормализованный текст,
import sun.text.Normalizer;
oDoc.setNameLC = Normalizer.normalize(oLocName, Normalizer.DECOMP, 0)
.toLowerCase().replaceAll("[^\\p{ASCII}]","");
Таким образом, кто-то, кто не знает, чтобы напечатать "Mèxico", может набрать "mexico" и получить матч, который возвращает "Mèxico" (среди множества других возможных хитов, таких как "Café Mèxico, Dubai, ОАЭ",).
Теперь у меня нет возможности изменить услугу, чтобы делать какие-либо выделения на стороне сервера, поэтому я подчеркиваю на стороне клиента JavaScript что-то вроде:
return result.replace( input.replace(/[aeiou]/g,"."), "<b>$1</b>");
Это немного больше, потому что я избегаю специальных символов регулярных выражений на входе. Это отлично подходит для простых совпадений с одним словом в начале хита, но он действительно ломается, если вы вдруг захотите поддержать многословные матчи, такие как "лондонское кафе":
input = input.strip().toLowerCase(); //fyi prototype strip is like trim
re = new RegEx(input.replace(/[aeiou]/g,".").replace(/\s+/g,"|"),"gi");
return result.replace(re, "<b>$1</b>");
Это не работает для "london ca" (набрал лондонское кафе), потому что это означало бы "Jack London Cabin, Dawson City, Canada" как: "Ja<b>ck</b> <b>London</b> <b>ca</b>bin, Dawson <b>Ci</b>ty, <b>Ca<b/>nada"
[обратите внимание на "ck" и "Ci", в частности]
Поэтому я ищу что-то, что не так безумно, как:
input = input.strip().toLowerCase();
input = input.replace(/a/g,"[ÀàÁáÂâÃãÄäÅåÆæĀāĂ㥹]");
input = input.replace(/e/g,"[ÈèÉéÊêËëĒēĔĕĖėĘęĚě]");
// ditto for i, o, u, y, c, n, maybe also d, g, h, j, k, l, r, s, t, w, z
re = new RegEx(input.replace(/\s+/g,"|"),"gi");
return result.replace(re, "<b>$1</b>");
Есть ли скомпилированная таблица, я могу ссылаться на сопоставление диапазона символов, которые являются акцентированными версиями другого символа для этого символа, с помощью которого я не имею в виду простую диаграмму unicode. И если да, могу ли я избежать использования странных, возможно медленных, выражений RegEx?
О щедрости:
Прежде чем я начал щедрость, было два ответа, один из которых указывал на то, что я делаю это в Ruby, и тот, который MizzardX написал, что было завершением основной формы, которую я поставил бы в своем вопросе. Теперь не поймите меня неправильно, я действительно ценю, как он работает так же хорошо, как и он, но я просто хотел, чтобы был другой способ. Кажется, что все, кто зашел, чтобы посмотреть на вопрос и ответ, решили, что MizzardX отлично его охватывает, или что у них нет другого подхода. Меня интересовал бы другой подход, и если он просто не будет доступен до того, как щедрость закроется, MizzardX выиграет награду (хотя в жестокой завихрении его редактирование с ума сойдет на ответ сообщества wiki, поэтому я не уверен, что он получит награду!)