Extraire des phrases arabes d'un texte donné en java


Pouvez-vous m'aider à trouver une expression régulière qui prend la liste des phrases et vérifier si l'une de ces phrases existe dans le texte donné, s'il vous plait?

Exemple:

Si j'ai dans le hashSet les mots suivants:

كيف الحال  
إلى أين  
أين يوجد  
هل من أحد هنا  

Et le texte donné est: كيف الحال أتمنى أن تكون بخير

Je veux obtenir après avoir effectué regex: كيف الحال

Mon code initial:

HashSet<String> QWWords = new HashSet<String>();

QWWords.add("كيف الحال");
QWWords.add("إلى أين");
QWWords.add("أين يوجد");
QWWords.add("هل من أحد هنا");

String s1 = "كيف الحال أتمنى أن تكون بخير";

for (String qp : QWWords) {

    Pattern p = Pattern.compile("[\\s" + qp + "\\s]");

    Matcher m = p.matcher(s1);

    String found = "";

    while (m.find()) {
        found = m.group();
        System.out.println(found);

    }

}
Author: Adil, 2014-05-17

1 answers

[...] est classe de caractères et la classe de caractères ne peut correspondre qu'à un seul caractère spécifié. Par exemple, une classe de caractères comme [abc] ne peut correspondre qu'à a OU b OU c. Donc, si vous voulez trouver uniquement le mot abc ne l'entourez pas de [...].

Un autre problème est que vous utilisez \\s comme séparateur de mots, donc dans la chaîne suivante

String data = "foo foo foo foo";

Regex \\sfoo\\s ne pourra pas correspondre en premier foo car il n'y a pas d'espace avant .
Alors d'abord match il trouvera sera

String data = "foo foo foo foo";
//      this one--^^^^^

Maintenant, puisque regex a consommé de l'espace après le deuxième foo, il ne peut pas le réutiliser dans la prochaine correspondance, donc le troisième foo sera également ignoré car il n'y a pas d'espace disponible pour correspondre avant.
Vous ne correspondrez pas non plus foo parce que cette fois il n'y a pas d'espace après.

Pour résoudre ce problème, vous pouvez utiliser \\b - limite de mot {[28] } qui vérifie si l'endroit qu'il représente est entre alphanumérique et non alphanumérique les caractères (ou de début/fin de chaîne).

, Donc au lieu de

Pattern p = Pattern.compile("[\\s" + qp + "\\s]");

Utiliser

Pattern p = Pattern.compile("\\b" + qp + "\\b");

, Ou peut-être mieux comme Tim mentionné

Pattern p = Pattern.compile("\\b" + qp + "\\b",Pattern.UNICODE_CHARACTER_CLASS);

Pour s'assurer que \\b inclura des caractères arabes dans la classe alphanumérique prédéfinie.

MISE À JOUR:

Je ne sais pas si vos mots peuvent contenir des métacaractères regex comme { [ + * et ainsi de suite, donc juste au cas où vous pouvez également ajouter un mécanisme d'échappement pour changer ces caractères en littéraux.

Donc

"\\b" + qp + "\\b"

Peut devenir

"\\b" + Pattern.quote(qp) + "\\b"
 4
Author: Pshemo, 2017-05-23 11:51:22