لنفترض الجملة التالية
String phrase = "جُمْلَةٌ مَشْكُولَةٌ لَكِنْ مِنْ دُونِ مَعْنَى";
ولنفترض أننا نريد البحث عن الكلمة التالية
String wordToFind = "دون";
عند استعمال الطريقة indexOf أو الطريقة matches، فإنهما لا تجدان الكلمة. لماذا؟ لأنها ببساطة غير موجودة، فرموز التشكيل تعتبر حروف بحد ذاتها ويجب أخذها بعين الإعتبار.
phrase.indexOf(wordToFind); //return -1 phrase.matches(wordToFind); //return false
حسب المعيار unicode، فإن حروف التشكيل تبتدأ من الكود 064B وتنتهي عند الكود 0653.
يمكننا استغلال هاته النقطة بكتابة تعبير regex يأخد رموز التشكيل بعين الإعتبار. في التعبير، سنضع بعد كل حرف من الكلمة التي نبحث عنها التعبير التالي
[\u064B-\u0653]?
والذي يعني أن كل حرف يمكن أن يكون متبوعا برمز للتشكيل.
public class SearchText {
public static void main(String[] args) {
String phrase = "جُمْلَةٌ مَشْكُولَةٌ لَكِنْ مِنْ دُونِ مَعْنَى";
String wordToFind = "دون";
char[] characters = wordToFind.toCharArray();
StringBuilder patternString = new StringBuilder();
for (int i = 0; i < characters.length; i++) {
patternString.append(characters + "[\u064B-\u0653]?");
}
boolean match = phrase.matches(".*" + patternString.toString() + ".*");
System.out.println(match);
}
}الطريقة matches تعيد فقط boolean. إذا أردنا استرجاع ال index الخاص بالكلمة، يمكن استعمال الفئتين Pattern و Matcher
Pattern pattern = Pattern.compile(patternString.toString());
Matcher matcher = pattern.matcher(phrase);
if (matcher.find()) {
System.out.println(matcher.start());
}النتيجة التي نحصل عليها هي 33، وهي مكان وجود الكلمة "دون" مع احتساب حروف التشكيل.
من لديه فكرة أفضل أو طريقة مباشرة فليشاركنا بها.
