2009-12-15 26 views
5

Bất cứ ai có thể giúp tôi với biểu thức chính quy javascript mà tôi có thể sử dụng để so sánh các chuỗi giống nhau, tham gia vào các phiên bản không được phiên bản của họ. Ví dụ:Regex để so sánh các chuỗi với các biến thể Umlaut và không Umlaut

, bằng tiếng Đức, từ Grüße cũng có thể được viết Gruesse. Hai dây này được coi là giống hệt nhau. Ánh xạ (bỏ qua vỏ cho thời điểm này) là:

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

Như không có nhiều " cặp "để xem xét tôi có thể làm thay thế cho mỗi biến thể, nhưng tôi tự hỏi nếu có một cách thanh lịch hơn, đặc biệt là trường hợp sử dụng này có thể cần phải được mở rộng trong tương lai để bao gồm ví dụ Ký tự Scandanavian ...

Trả lời

14

cái gì đó như

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

bạn có thể dễ dàng mở rộng này bằng cách bổ sung thêm các mục vào "tr"

không khá thanh lịch, nhưng hoạt động

+0

trông rất tiện dụng - Tôi sẽ thử. Cảm ơn bạn! – davek

+0

hoàn hảo - nó hoạt động và tôi cũng nói nó thanh lịch! – davek

1

Regex không phải là công nghệ tốt hơn để giải quyết vấn đề này.

Bạn nên cân nhắc tạo từ điển để lưu trữ ký tự Umlaut của bạn dưới dạng khóa và không Umlaut làm giá trị; Sau đó, bạn có thể lặp qua yourdictionary, kiểm tra xem nó có tồn tại trên chuỗi của bạn không và thực hiện hành động thích hợp.

1

Bạn có thể sử dụng đường ống như một hoặc trong một nhóm cho mỗi kết hợp như thế này (ä|ae).

1

Một cách là xử lý đầu vào 'regexp' của bạn để nó thay thế cho ví dụ 'ä' bằng (ae | ä) '- không mã hóa ánh xạ tới các regexps của bạn. Tôi hoàn toàn không biết gì đến javascript (ok, tôi biết document.write() nhưng đó là về nó) - nhưng ở đây là như nhau trong mã giả;

thay vì làm

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

Bạn nên làm điều gì đó như:

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) 

Xin lỗi vì đã quá "pythonic" - Tôi không biết nếu bạn có re.compile() -like cấu trúc trong javascript, nhưng nếu bạn làm - bạn nên thực hiện vòng lặp khi biên dịch đối sánh, không phải trong my_regexp_match()

+0

Niềng răng là pythonic? : P Ít nhất sử dụng các nhóm không bắt giữ, nhưng điều này vẫn không thành công đối với các lớp ký tự ('[äö]'). –

4

Cụm từ thông dụng không phải là khá đủ mạnh để làm điều này đúng cách, mặc dù bạn có thể hack nó vào gần như làm việc với họ.

Điều bạn muốn được gọi là Chuẩn hóa Unicode. Một chuỗi được chuẩn hóa là một chuỗi được chuyển đổi thành dạng chung để bạn có thể so sánh chúng. Tuy nhiên, bạn đã gắn thẻ bài đăng "javascript" của mình, Javascript không có thư viện chuẩn được tích hợp để thực hiện việc này và tôi không biết một cách thủ công. Hầu hết các ngôn ngữ phía máy chủ đều có một ngôn ngữ. Ví dụ: Normalizer Class trong PHP. Python và Perl có tương đương, cũng như công cụ của Microsoft, tôi chắc chắn.

Khám phá bài viết wikipedia trên Unicode Equivalence để biết thêm thông tin.

+0

đó là những liên kết hữu ích - cảm ơn bạn. – davek

5

Ngoài 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] }) 
} 

Tôi đã giao dịch với Umlauts trong một tập lệnh Aptana/Eclipse d các nhân vật bình thường ('ä' vv) đã không làm các trick cho tôi.

+0

Cảm ơn bạn rất nhiều vì đã liệt kê những mã đó ... tôi đã phát điên vì sao Javascript không thay thế tiêu chuẩn "ß" ... mà không nhận ra nó. – Matt

3

Tôi có một cách khác: (mục đích: sắp xếp mảng)

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

Bạn bỏ lỡ á trong dòng 4. –

+0

cũng đćč vv cho croatian – Silve2611

Các vấn đề liên quan