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