Regex для сравнения строк с вариациями Umlaut и не Umlaut - PullRequest
5 голосов
/ 15 декабря 2009

Может ли кто-нибудь помочь мне с регулярным выражением javascript, которое я могу использовать для сравнения одинаковых строк, учитывая их не-умлаудские версии.

например, на немецком языке слово Grüße также может быть написано Gruesse. Эти две строки следует считать идентичными. Отображения (без учета оболочек на данный момент):

  • ä = ae
  • ü = ue
  • ö = oe
  • ß = сс

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

Ответы [ 7 ]

14 голосов
/ 15 декабря 2009

что-то вроде

tr = {"ä":"ae", "ü":"ue", "ö":"oe", "ß":"ss" }

replaceUmlauts = function(s) {
    return s.replace(/[äöüß]/g, function($0) { return tr[$0] })
}

compare = function(a, b) {
    return replaceUmlauts(a) == replaceUmlauts(b)
}

alert(compare("grüße", "gruesse"))

Вы можете легко расширить это, добавив больше записей в "tr"

не совсем элегантно, но работает

5 голосов
/ 16 мая 2011

У меня есть другой способ: (цель: сортировка массивов)

function umlaut(str) {
 return str
  .replace(/Â|À|Å|Ã/g, "A")
  .replace(/â|à|å|ã/g, "a")
  .replace(/Ä/g, "AE")
  .replace(/ä/g, "ae")
  .replace(/Ç/g, "C")
  .replace(/ç/g, "c")
  .replace(/É|Ê|È|Ë/g, "E")
  .replace(/é|ê|è|ë/g, "e")
  .replace(/Ó|Ô|Ò|Õ|Ø/g, "O")
  .replace(/ó|ô|ò|õ/g, "o")
  .replace(/Ö/g, "OE")
  .replace(/ö/g, "oe")
  .replace(/Š/g, "S")
  .replace(/š/g, "s")
  .replace(/ß/g, "ss")
  .replace(/Ú|Û|Ù/g, "U")
  .replace(/ú|û|ù/g, "u")
  .replace(/Ü/g, "UE")
  .replace(/ü/g, "ue")
  .replace(/Ý|Ÿ/g, "Y")
  .replace(/ý|ÿ/g, "y")
  .replace(/Ž/g, "Z")
  .replace(/ž/, "z"); 
}
5 голосов
/ 29 июня 2010

В дополнение к стереофрогам ответ :

tr = {"\u00e4":"ae", "\u00fc":"ue", "\u00f6":"oe", "\u00df":"ss" }

ersetzeUmlauts = function(s) {
    return s.replace(/[\u00e4|\u00fc|\u00f6|\u00df]/g, function($0) { return tr[$0] })
}

Я имел дело с умлаутами в сценарии Aptana / Eclipse, и обычные символы ('ä' и т. Д.) Не помогли мне.

4 голосов
/ 15 декабря 2009

Регулярные выражения не являются достаточно достаточно мощными, чтобы сделать это правильно, хотя вы можете взломать их почти для работы с ними.

То, что вы хотите, называется Нормализация Unicode. Нормализованная строка - это одна преобразованная в общую форму, чтобы вы могли сравнить их. Вы пометили свой пост как "javascript", однако у Javascript нет встроенной стандартной библиотеки для этого, и я не знаю ни одного случая. Тем не менее, большинство серверных языков имеют один. Например, Класс нормализатора в PHP. У Python и Perl есть эквиваленты, как и у Microsoft, я уверен.

Дополнительную информацию смотрите в статье в Википедии Эквивалентность Unicode .

1 голос
/ 15 декабря 2009

Один из способов - обработать входные данные регулярного выражения так, чтобы они, например, заменили 'ä' на (ae | ä) ', а не жестко закодировали сопоставления с регулярными выражениями. Я совершенно не осведомлен о javascript (хорошо, я знаю document.write (), но это все) - но здесь то же самое в псевдокоде;

вместо того, чтобы

regexp_match("Grüße|Gruesse",somestring)

Вы должны сделать что-то вроде:

mappings = (("ä","ae"),("ö","oe"),("ü","ue"))
def my_regexp_match(regexp,input) {
    for key,value in mappings {
         new_regexp = regexp.replace(key,"("+key+"|"+value+")")
    }
    regexp_match(new_regexp,input)
}
my_regexp_match("Grüße",somestring)

Извините за то, что я так "питоничен" - я не знаю, есть ли у вас структура, похожая на re.compile () в javascript, но если вы это сделаете - вы должны использовать for -loop при компиляции средства сравнения, а не в my_regexp_match )

1 голос
/ 15 декабря 2009

Вы можете использовать трубу как или в группе для каждого соответствия, как это (ä|ae).

1 голос
/ 15 декабря 2009

Regex не лучшая технология для решения этой проблемы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...