Vérifier si une chaîne contient un mot, mais seulement dans certaines position?
Comment puis-je vérifier si une chaîne contient une sous-chaîne, mais seulement dans une position?
Exemple de chaîne:
Qu'est-ce que votre préféré couleur? mon [préféré] la couleur est bleu
Si je voulais vérifier si la chaîne de caractères contenue un mot spécifique, j'ai l'habitude de le faire:
var
S: string;
begin
S := 'What is your favorite color? my [favorite] color is blue';
if (Pos('favorite', S) > 0) then
begin
//
end;
end;
Ce dont j'ai besoin est de déterminer si le mot préféré existe dans la chaîne, ignorant si elle apparaît à l'intérieur du [ ] symboles, le code ci-dessus de l'échantillon n'est manifestement pas le faire.
Donc, si nous avons mis le code dans une fonction booléenne, certains résultats de l'échantillon devrait ressembler à ceci:
VRAI: qu'est-Ce que votre préféré couleur? mon [mon préféré] la couleur est bleu
VRAI: qu'est-Ce que votre préféré couleur? mon [bla bla] la couleur est bleu
FAUX: qu'est-Ce que votre bla bla couleur? mon [certains favoris] la couleur est bleu
Les deux premiers exemples ci-dessus sont vraies parce que le mot favori se trouve en dehors de la [ ] les symboles, si elle est à l'intérieur ou pas.
La 3ème échantillon est faux car même si il y a le mot favori, il n'apparaît à l'intérieur de l' [ ] symboles - nous ne devrions vérifier si il existe en dehors des symboles.
J'ai donc besoin d'une fonction pour déterminer si ou non un mot (favori dans cet exemple) apparaît dans une chaîne de caractères, mais en ignorant le fait que si le mot est entouré à l'intérieur de [ ] symboles.
- Idées: 1) Diviser la chaîne sur le
\s
et de vérifier pour la 4ème élément. 2) cochez la Case pour "favori" (notez les espaces autour de la parole). 3) Diviser la chaîne sur le point d'interrogation?
et de vérifier ensuite si elle détientfavorite
. - De recherche '[', si trouvé de recherche ']', supprimer dans l'entre-deux, y compris '[]', recherche pour le favori.
- Ou utiliser une expression régulière (avec les unités incluses dans XE) avec une regex de
'\b' + wordtofind + '\b'
. La seule chose que vous avez à regarder dehors pour estIs it your favorite?
, où la?
ferait-il pas de match. - Pour élargir @Ken idée regex,
this
peut-être une source d'inspiration.
Vous devez vous connecter pour publier un commentaire.
J'aime
Sertac l'idée de
propos de la suppression de chaînes de caractères délimitée par des crochets et de rechercher une chaîne de suite. Voici un exemple de code prolongée par une recherche de mots entiers et le respect de la casse:Ici est une version optimisée de la fonction, qui utilise le pointeur de char itération sans manipulation de chaîne. En comparaison avec la version précédente de cette traite le cas lorsque vous avez une chaîne avec manque de fermeture de support, comme par exemple
My [favorite color is
. Une telle chaîne est-il Vraie raison de cette absence de support.Le principe est d'aller à travers l'ensemble de la chaîne de char par char et quand vous trouver le crochet ouvrant, regardez si le support a une paire de clôture pour lui-même. Si oui, puis vérifiez si la sous-chaîne à partir de la position stockée jusqu'à l'ouverture du support contenant le mot recherché. Si oui, la sortie de la fonction. Si pas le cas, déplacer la position enregistrée pour le crochet de fermeture. Si le support n'est pas propre paire de clôture, recherche pour le mot à partir de la position enregistrée à la fin de l'ensemble de la chaîne et de sortie de la fonction.
Pour la version commentée de ce code suivez ce lien.
Dans les expressions régulières, il y a un truc qui s'appelle regardez autour de que vous pouvez utiliser. Dans votre cas, vous pouvez résoudre avec des lookbehind: vous voulez "favori", sauf s'il est précédé d'une parenthèse ouvrante. Il pourrait ressembler à ceci:
Étape par étape:
(?<!
est le négatif lookbehind préfixe, nous sommes à la recherche pour\[
éventuellement suivie par aucun ou plusieurs choses qui ne sont pas de la fermeture ou de l'ouverture des crochets:[^\[\]]*
, fermer le négatif lookbehind avec)
, puisfavorite
juste après.Je pense que vous pouvez reformuler votre problème à trouver un ocurrence de la chaîne de ne pas être entouré par des crochets." Si cela décrit votre problème, alors vous pouvez aller de l'avant et à l'utilisation d'une expression régulière simple comme
[^\[]favorite[^\]]
.