regex en javascript - correspondre à plusieurs termes de recherche sans tenir compte de leur ordre
Je voudrais trouver tous les matchs de la chaîne (séparés par des espaces) dans une chaîne de caractères.
(À la manière, par exemple, iTunes boîte de recherche travaille).
Que, par exemple, à la fois "ab de" et "de ab" renvoient true "abcde" (aussi "bc e un" ou toute commande doit retourner true)
Si je remplace l'espace blanc avec une wild card, "ab*de" renvoie true en cas de "abcde", mais pas "de*ab".
[Je utiliser * et pas de syntaxe Regex juste pour cette explication]
Je ne pouvais pas trouver tout de la pure Regex solution pour cela.
La seule solution, je pense crève le terme de recherche et d'exécuter plusieurs Regex.
Est-il possible de trouver une pure expression Regex qui couvrira toutes ces options ?
Pourquoi ne
ab*de
match abcd
? Où est la e
? Aussi, si le modèle ad de
également être valable sur le mot donné ad hominem
(depuis ad
est trouvé)? Quelle est la signification de l'astérisque: Doit antérieure non-blanc personnages de être mis en correspondance, ou tout simplement le caractère précédent?Je pensais juste que pure Regex serait plus rapide. J'ai utiliser cette recherche pour filtrer les résultats à la volée pour une liste déroulante. Donc, il se doit d'être rapide.
Je suis assez sûr il n'est pas une pure regex solution pour cela.
Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems.
- Jamie ZawinskiW: mon erreur. Je fixe ma question (il était "abde" dans "abcde"). Et oui "" signifie que tous les non-espaces doivent être appariés.
OriginalL'auteur Ranch | 2012-01-10
Vous devez vous connecter pour publier un commentaire.
Retourne
true
lorsque toutes les parties (divisé par,
ou' '
) d'unsearchString
se produire dans le texte. Sinonfalse
est retourné.OriginalL'auteur Karl Adler
Je suis sûr que vous pourriez en venir à une regex pour faire ce que vous voulez, mais il peut ne pas être l'approche la plus efficace.
Par exemple, l'expression régulière pattern
(?=.*bc)(?=.*e)(?=.*a)
correspond à toute chaîne de caractères qui contientbc
,e
, eta
.Vous pouvez écrire une fonction pour créer dynamiquement une expression basée sur vos termes de recherche, mais si c'est la meilleure façon d'accomplir ce que vous faites, c'est une autre question.
OriginalL'auteur RoccoC5
Essayez ceci:
i
etc
n'ont pas été déclarés. Cela mis à part, pourquoi êtes-vous de vérifierc
contre un tableau? Scission aura toujours retourner un tableau, contenant un élément si aucun caractère n'est trouvé, ou zéro des éléments si la chaîne est vide.Vous avez raison. Merde, totalement n'ai pas d'avis... Édité maintenant.
str.split( " " )
crée un tableau, même si il n'y a pas d'espaces dans les strc'est pourquoi la réponse a été édité 5 minutes avant ton commentaire =)
OriginalL'auteur Michael Sazonov
Alternances sont insensibles:
Donc si vous avez une liste de mots pour le match, vous pouvez construire une regex avec une alternance à la volée comme suit:
c'est une approche agréable , mais il renvoie true lorsque les mots ("ab" OU "de") seront dans la chaîne trouvée. Je veux qu'il retourne true si les deux 'ab' ET 'de' trouvé.
Ensuite, vérifiez si les deux " ab " et " de " sont trouvés dans le tableau de concordance?
OriginalL'auteur maerics
C'est le script que j'utilise: il fonctionne également avec un seul mot searchStrings
OriginalL'auteur Jan Šafránek
Je suppose que vous êtes d'appariement de mots ou parties de mots. Vous souhaitez séparés par des espaces, des termes de recherche pour limiter les résultats de recherche, et il semble que vous avez l'intention de retourner uniquement les entrées qui ont tous les mots que l'utilisateur fournit. Et vous avez l'intention d'un caractère générique
*
de stand de 0 ou plusieurs caractères dans un mot correspondant.Par exemple, si l'utilisateur recherche les mots term1 terme2, vous avez l'intention de retourner uniquement les éléments qui ont les deux mots
term1
etterm2
. Si l'utilisateur recherche pour le mot *, il correspond à n'importe quel mot commençant parterm
.Il y a des expressions régulières qui correspondent à cette recherche de la langue et peut être généré à partir d'elle.
Un exemple simple, le mot
term
, peut être invoquée dans le regex par la conversion de\bterm\b
. Mais deux mots ou plus qui doit correspondre dans n'importe quel ordre exigent les assertions avant. À l'aide de la syntaxe étendue, l'équivalent de la regex est:Le caractère générique astérisque peut être invoquée dans le regex avec une classe de caractères suivie par un astérisque. La classe de caractères qui identifie les lettres que vous considérez comme faisant partie de mot. Par exemple, vous trouverez peut-être que
[A-Za-z0-9]*
correspond à la facture.En bref, vous pouvez être satisfait si vous convertissez une expression comme:
:
C'est une simple question de recherche et de remplacement. Mais faites attention à désinfecter la chaîne d'entrée pour éviter les attaques par injection, par la suppression de la ponctuation, etc.
OriginalL'auteur MetaEd
Je pense que vous pouvez peut-être aboiements le mauvais arbre avec des RegEx. Ce que vous pourrait voulez regarder, c'est la Levenshtein de deux chaînes d'entrée.
Il y a un Javascript de mise en œuvre ici et un exemple d'utilisation ici.
apple pear
etpear apple
(avec deux espaces) comme ayant la même distance queapple pear
etpear orange
...OriginalL'auteur Demian Brecht