2009-12-15 2 views
5

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

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

  • ä = ае
  • ü = уй
  • ö = ае
  • ß = сс

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

ответ

14

что-то вроде

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")) 

вы можете легко расширяется путем добавления больше записей в "тр"

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

+0

, который выглядит очень удобно - я попробую. Спасибо! – davek

+0

отлично - он работает, и я бы тоже сказал, что это элегантно! – davek

1

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

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

1

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

1

Один из способов - обработать ваш ввод «регулярного выражения» так, чтобы он заменял, например, «ä» (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()

+0

Брекеты вещий? : P По крайней мере, используйте группы, не связанные с захватом, но это все еще не выполняется для классов символов ('[äö]'). – 2009-12-15 20:07:55

4

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

Что вы хотите назвать Нормализация Юникода. Нормализованная строка преобразуется в общую форму, поэтому вы можете сравнить их. Вы отметили свой пост «javascript», однако Javascript не имеет встроенной стандартной библиотеки для этого, и я не знаю об этом. На большинстве серверных языков есть один. Например, Normalizer Class в PHP. У Python и Perl есть эквиваленты, как и у Microsoft, я уверен.

За дополнительной информацией обращайтесь к статье Википедии по телефону Unicode Equivalence.

+0

Это полезные ссылки - спасибо. – davek

5

В дополнение к stereofrogs answer:

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] }) 
} 

Я имел дело с Umlauts в сценарии Aptana/Eclipse и d нормальные персонажи («ä» и т. д.) не сделали трюк для меня.

+0

Большое вам спасибо за то, что вы указали эти \ коды ... я собирался с ума по поводу того, почему Javascript не заменит стандартный «ß» ... просто не узнал его. – Matt

3

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

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"); 
} 
+2

Вы пропустили в строке 4. –

+0

также đćč и т. Д. Для хорватского – Silve2611

Смежные вопросы