2013-12-24 7 views
6

У меня есть арабский текст в базе данных с диакритикой. когда я набираю арабский язык для поиска некоторой строки, это без диакритики, которая определенно не соответствует строке базы данных. он отлично работает над текстом без диакритики. есть ли способ запустить его по тексту с диакритикой ???Как выполнить поиск по арабскому тексту в JAVA?

+0

Что такое кодировка текста? Это utf-8? – MIE

+0

Вы хотите найти U + 0632 и найти U + 0633 например? В этом случае вы можете написать свой собственный поиск или string.replace() некоторое регулярное выражение в (с помощью поиска в регулярном выражении)? –

ответ

6

есть ли способ запустить его по тексту с диакритикой ???

К сожалению, нет. Как MIE сказал:

Arabic диакритические персонажи

так что это не представляется возможным, насколько я знаю.

Ответ MIE будет сложно реализовать и будет просто невозможно получить обновление, если вы измените что-либо в своей базе данных.

Возможно, вы можете посмотреть на Apache Lucene search software Library. Я не уверен, но похоже, что он может решить вашу проблему.

Или вам нужно снять все диакритические из базы данных, а затем вы сможете запросить его с или без диакритики просто с помощью небольшого арабского Normalizer как this one:

/** 
* ArabicNormalizer class 
* @author Ibrabel 
*/ 
public final class ArabicNormalizer { 

    private String input; 
    private final String output; 

    /** 
    * ArabicNormalizer constructor 
    * @param input String 
    */ 
    public ArabicNormalizer(String input){ 
     this.input=input; 
     this.output=normalize(); 
    } 

    /** 
    * normalize Method 
    * @return String 
    */ 
    private String normalize(){ 

     //Remove honorific sign 
     input=input.replaceAll("\u0610", "");//ARABIC SIGN SALLALLAHOU ALAYHE WA SALLAM 
     input=input.replaceAll("\u0611", "");//ARABIC SIGN ALAYHE ASSALLAM 
     input=input.replaceAll("\u0612", "");//ARABIC SIGN RAHMATULLAH ALAYHE 
     input=input.replaceAll("\u0613", "");//ARABIC SIGN RADI ALLAHOU ANHU 
     input=input.replaceAll("\u0614", "");//ARABIC SIGN TAKHALLUS 

     //Remove koranic anotation 
     input=input.replaceAll("\u0615", "");//ARABIC SMALL HIGH TAH 
     input=input.replaceAll("\u0616", "");//ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH 
     input=input.replaceAll("\u0617", "");//ARABIC SMALL HIGH ZAIN 
     input=input.replaceAll("\u0618", "");//ARABIC SMALL FATHA 
     input=input.replaceAll("\u0619", "");//ARABIC SMALL DAMMA 
     input=input.replaceAll("\u061A", "");//ARABIC SMALL KASRA 
     input=input.replaceAll("\u06D6", "");//ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA 
     input=input.replaceAll("\u06D7", "");//ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA 
     input=input.replaceAll("\u06D8", "");//ARABIC SMALL HIGH MEEM INITIAL FORM 
     input=input.replaceAll("\u06D9", "");//ARABIC SMALL HIGH LAM ALEF 
     input=input.replaceAll("\u06DA", "");//ARABIC SMALL HIGH JEEM 
     input=input.replaceAll("\u06DB", "");//ARABIC SMALL HIGH THREE DOTS 
     input=input.replaceAll("\u06DC", "");//ARABIC SMALL HIGH SEEN 
     input=input.replaceAll("\u06DD", "");//ARABIC END OF AYAH 
     input=input.replaceAll("\u06DE", "");//ARABIC START OF RUB EL HIZB 
     input=input.replaceAll("\u06DF", "");//ARABIC SMALL HIGH ROUNDED ZERO 
     input=input.replaceAll("\u06E0", "");//ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO 
     input=input.replaceAll("\u06E1", "");//ARABIC SMALL HIGH DOTLESS HEAD OF KHAH 
     input=input.replaceAll("\u06E2", "");//ARABIC SMALL HIGH MEEM ISOLATED FORM 
     input=input.replaceAll("\u06E3", "");//ARABIC SMALL LOW SEEN 
     input=input.replaceAll("\u06E4", "");//ARABIC SMALL HIGH MADDA 
     input=input.replaceAll("\u06E5", "");//ARABIC SMALL WAW 
     input=input.replaceAll("\u06E6", "");//ARABIC SMALL YEH 
     input=input.replaceAll("\u06E7", "");//ARABIC SMALL HIGH YEH 
     input=input.replaceAll("\u06E8", "");//ARABIC SMALL HIGH NOON 
     input=input.replaceAll("\u06E9", "");//ARABIC PLACE OF SAJDAH 
     input=input.replaceAll("\u06EA", "");//ARABIC EMPTY CENTRE LOW STOP 
     input=input.replaceAll("\u06EB", "");//ARABIC EMPTY CENTRE HIGH STOP 
     input=input.replaceAll("\u06EC", "");//ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE 
     input=input.replaceAll("\u06ED", "");//ARABIC SMALL LOW MEEM 

     //Remove tatweel 
     input=input.replaceAll("\u0640", ""); 

     //Remove tashkeel 
     input=input.replaceAll("\u064B", "");//ARABIC FATHATAN 
     input=input.replaceAll("\u064C", "");//ARABIC DAMMATAN 
     input=input.replaceAll("\u064D", "");//ARABIC KASRATAN 
     input=input.replaceAll("\u064E", "");//ARABIC FATHA 
     input=input.replaceAll("\u064F", "");//ARABIC DAMMA 
     input=input.replaceAll("\u0650", "");//ARABIC KASRA 
     input=input.replaceAll("\u0651", "");//ARABIC SHADDA 
     input=input.replaceAll("\u0652", "");//ARABIC SUKUN 
     input=input.replaceAll("\u0653", "");//ARABIC MADDAH ABOVE 
     input=input.replaceAll("\u0654", "");//ARABIC HAMZA ABOVE 
     input=input.replaceAll("\u0655", "");//ARABIC HAMZA BELOW 
     input=input.replaceAll("\u0656", "");//ARABIC SUBSCRIPT ALEF 
     input=input.replaceAll("\u0657", "");//ARABIC INVERTED DAMMA 
     input=input.replaceAll("\u0658", "");//ARABIC MARK NOON GHUNNA 
     input=input.replaceAll("\u0659", "");//ARABIC ZWARAKAY 
     input=input.replaceAll("\u065A", "");//ARABIC VOWEL SIGN SMALL V ABOVE 
     input=input.replaceAll("\u065B", "");//ARABIC VOWEL SIGN INVERTED SMALL V ABOVE 
     input=input.replaceAll("\u065C", "");//ARABIC VOWEL SIGN DOT BELOW 
     input=input.replaceAll("\u065D", "");//ARABIC REVERSED DAMMA 
     input=input.replaceAll("\u065E", "");//ARABIC FATHA WITH TWO DOTS 
     input=input.replaceAll("\u065F", "");//ARABIC WAVY HAMZA BELOW 
     input=input.replaceAll("\u0670", "");//ARABIC LETTER SUPERSCRIPT ALEF 

     //Replace Waw Hamza Above by Waw 
     input=input.replaceAll("\u0624", "\u0648"); 

     //Replace Ta Marbuta by Ha 
     input=input.replaceAll("\u0629", "\u0647"); 

     //Replace Ya 
     // and Ya Hamza Above by Alif Maksura 
     input=input.replaceAll("\u064A", "\u0649"); 
     input=input.replaceAll("\u0626", "\u0649"); 

     // Replace Alifs with Hamza Above/Below 
     // and with Madda Above by Alif 
     input=input.replaceAll("\u0622", "\u0627"); 
     input=input.replaceAll("\u0623", "\u0627"); 
     input=input.replaceAll("\u0625", "\u0627"); 

     return input; 
    } 

    /** 
    * @return the output 
    */ 
    public String getOutput() { 
     return output; 
    } 

    public static void main(String[] args) { 
     String test = "كَلَّا لَا تُطِعْهُ وَاسْجُدْ وَاقْتَرِبْ ۩"; 
     System.out.println("Before: "+test); 
     test=new ArabicNormalizer(test).getOutput(); 
     System.out.println("After: "+test); 
    } 
} 
+0

Большое спасибо, эта программа действительно полезна. –

1

арабские диакритические персонажи, так что вы можете использовать, как п так:

SELECT * FROM table WHERE name LIKE 'a[cd]*b[cd]*' 

это найти «AB» с любым числом с или г между ними.

вы могли бы сделать это, добавив все арабские диакритические в квадратных скобках после каждой буквы

here вы можете найти все из них с их точки Юникода кода.

4

I нашел гораздо лучше сделать это. Все награды joop для этого:

import java.text.Normalizer; 
import java.text.Normalizer.Form; 

/** 
* 
* @author Ibbtek <http://ibbtek.altervista.org/> 
*/ 
public class ArabicDiacritics { 

    private String input; 
    private final String output; 

    /** 
    * ArabicDiacritics constructor 
    * @param input String 
    */ 
    public ArabicDiacritics(String input){ 
     this.input=input; 
     this.output=normalize(); 
    } 

    /** 
    * normalize Method 
    * @return String 
    */ 
    private String normalize(){ 

     input = Normalizer.normalize(input, Form.NFKD) 
       .replaceAll("\\p{M}", ""); 

     return input; 
    } 

    /** 
    * @return the output 
    */ 
    public String getOutput() { 
     return output; 
    } 

    public static void main(String[] args) { 
     String test = "كَلَّا لَا تُطِعْهُ وَاسْجُدْ وَاقْتَرِبْ ۩"; 
     System.out.println("Before: "+test); 
     test=new ArabicDiacritics(test).getOutput(); 
     System.out.println("After: "+test); 
    } 
} 
+0

Возможно, вам стоит поместить ссылку на то, что поставило вас на правильный путь для этого ответа – dvhh

0

Пожалуйста, смотрите ниже класса я создал это для андроид, вернуть spannable String. Это так просто и не беспокоиться о потреблении памяти. Вы, ребята, можете оптимизировать себя.

http://freshinfresh.com/sample/ABHArabicDiacritics.java

Если вы хотите, чтобы проверить, не nunation (harakath) содержит в аравийской строки,

ABHArabicDiacritics objSearchd = new ABHArabicDiacritics(); 
objSearchdobjSearch.getDiacriticinsensitive("وَ اَشْهَدُ اَنْ لا اِلهَ اِلاَّ اللَّهُ").contains("اشهد"); 

Если вы хотите вернуть Highlighed или redColored искали участок в String. Использование ниже кода

ABHArabicDiacritics objSearch = new ABHArabicDiacritics(وَ اَشْهَدُ اَنْ لا اِلهَ اِلاَّ اللَّهُ, اشهد); 
SpannableString spoutput=objSearch.getSearchHighlightedSpan(); 
      textView.setText(spoutput); 

Чтобы увидеть начальную и конечную позицию поиска текста, Использование ниже методов,

/** to serch Contains */ 
      objSearch.isContain();// 
      objSearch.getSearchHighlightedSpan(); 
      objSearch.getSearchTextStartPosition(); 
      objSearch.getSearchTextEndPosition(); 

Пожалуйста, скопируйте общий класс Java и наслаждаться.

Я потрачу больше времени на большее количество функций, если вы, ребята, попросите.

Thanks