Hope not to be late to the party, my issue is a little bit different than the OP, I wanted to search for Arabic text with diacritics and wanted to mark the searched text with some color, so I need to save the indices of the matched text.
The issue is that normalizing the text without diacritics will reduce the text length, and will get different indices of the searched text.
So, got that solved by using regex and SpannableString
/*
* input: input text with Arabic Diacritics Or Letters that you want to ignore while searching
* searchedWord: the word/text that you want to search in @input text
* color: used to return a the founded matches with a different Foreground color using a SpannableString
* */
public static Spannable searchArabicWithIgnoredDiacriticsOrLetters(String input, String searchedWord, int color) {
Spannable output = new SpannableString(replaceLetters(input));
StringBuilder sb = new StringBuilder();
for (char ch : replaceLetters(searchedWord).toCharArray()) {
sb.append(ch);
sb.append("[\\u0655\\u0654\\u0670\\u065F\\u065E\\u065D\\u065C\\u065B\\u065A\\u0659\\u0658\\u0657\\u0656\\u06EC\\u06EB\\u06EA\\u06E4\\u061A\\u0619\\u0618\\u0617\\u0616\\u0615\\u064B\\u064C\\u064D\\u064E\\u064F\\u0650\\u0651\\u0652\\u0653\\u06DA\\u06D6\\u06D7\\u06D8\\u06D9\\u06DB\\u06DC\\u06DF\\u06E0\\u06E1\\u06E2\\u06E3\\u06E5\\u06E6\\u06E7\\u06E8\\u06EB\\u06EC\\u06ED]*");
}
Pattern pattern = Pattern.compile(String.valueOf(sb)); // get Pattern of the Regex
Matcher matcher = pattern.matcher(input); // get Matcher of the Pattern Regex in the input text
while (matcher.find())
output.setSpan(new ForegroundColorSpan(color),
matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return output;
}
public static String replaceLetters(String input) {
String output;
output = input.replaceAll("أ", "ا");
output = output.replaceAll("إ", "ا");
output = output.replaceAll("ى", "ي");
output = output.replaceAll("ة", "ه");
output = output.replaceAll("آ", "ا");
output = output.replaceAll("ٱ", "ا");
return output;
}
Another representation of replaceLetters()
public static String replaceLetters(String input) {
String output;
output = input.replaceAll("\\u0623", String.valueOf((char) Integer.parseInt("0627", 16))); // replace أ with ا
output = output.replaceAll("\\u0625", String.valueOf((char) Integer.parseInt("0627", 16))); // replace إ with ا
output = output.replaceAll("\\u0649", String.valueOf((char) Integer.parseInt("064A", 16))); // replace ي with ى
output = output.replaceAll("\\u0629", String.valueOf((char) Integer.parseInt("0647", 16))); // replace ة with ه
output = output.replaceAll("\\u0622", String.valueOf((char) Integer.parseInt("0627", 16))); // replace آ with ا
output = output.replaceAll("\\u0671", String.valueOf((char) Integer.parseInt("0627", 16))); // replace ٱ with ا
return output;
}
Note: you can refer to the accepted answer for the Unicode representation.