Comment extraire des liens contenant un certain mot?
Par exemple:
https: / /www.test.com/text/1@@@https://www.test.com/text/ mot / 2 @@@ https://www.test.com/text/text/ mot / 3 @@@ https://www.test.com/3 /text@@@https://www.test.com/ word
Comment rechercher " mot " sous l'expression régulière?
((https:).*?(@@@))
Le résultat devrait être comme ça
https://www.test.com/text/ mot fort> / 2
https://www.test.com/text/text/ mot / 3
https://www.test.com/ mot / 3 / text / text
4 Réponses :
Vous pouvez d'abord diviser par @@@ puis vérifier si / word / existe dans chaque élément:
var s = 'https://www.test.com/text/1@@@https://www.test.com/text/word/2@@@https://www.test.com/text/text/word/3@@@https://www.test.com/3/text@@@https://www.test.com/word/3/text/text';
var result = [];
s.split(/@@@/).forEach(function(el) {
if (el.includes('/word/'))
result.push(el);
})
// or else by using filter
// result = s.split(/@@@/).filter(el => el.includes('/word/'))
console.log(result);
Vous recherchez certainement cette expression régulière:
var str = 'https://www.test.com/text/1@@@https://www.test.com/text/word/2@@@https://www.test.com/text/text/word/3@@@https://www.test.com/3/text@@@https://www.test.com/word/3/text/text'; var urls = str.match(/(?<=\/)\w+(?=\/\d+\/\w)|(?<=(\w\/\w+\/))\w+(?=\/\d)/g); console.log(urls);
Voici comment vous pouvez l'utiliser dans le contexte JavaScript ( toute barre oblique / est échappée par une barre oblique inverse \/):
var str = 'https://www.test.com/text/1@@@https://www.test.com/text/word/2@@@https://www.test.com/text/text/word/3@@@https://www.test.com/3/text@@@https://www.test.com/word/3/text/text'; var urls = str.match(/https:\/\/www.test.com\/(text\/)*word\/\d+(\/text)*/g); console.log(urls);
Dans le tableau, vous obtenez exactement les éléments que vous vouliez.
Si vous avez besoin de prendre le mot s de votre exemple de chaîne, vous devez alors utiliser une exception régulière un peu plus complexe:
https://www.test.com/(text/)*word/\d+(/text)*
Voici l'expression régulière / (? , limité par /.../ et par le g code> indicateur forçant les recherches de modèle pour l'occurrence.
L'expression régulière a deux alternatives ...|...
La première ( ? capture les cas où le mot recherché est directement derrière la barre oblique (? et avant d'autres mots derrière le nombre (?=\/\d+\/\w).
La deuxième alternative (? capture les cas où le mot est précédé de d'autres mots suivant le domaine (? (en fait deux barres obliques séparées par des caractères alphanumériques) et le mot recherché est immédiatement avant la barre oblique suivie du nombre (?=\/\d).
Toutes les barres obliques doivent être échappées: \/.
La construction (? signifie lookbehind dans les expressions régulières et (? = ...) signifie lookahead dans les expressions régulières.
Remarque 1. L'exemple ci-dessus ne fonctionne actuellement que dans un navigateur Chrome, car cela :
(...) maintenant lookbehind fait partie de la spécification ECMAScript 2018. Au moment d'écrire ces lignes (fin 2018), le navigateur Chrome de Google est la seule implémentation JavaScript populaire qui prend en charge lookbehind. Donc, si la compatibilité entre navigateurs est importante, vous ne pouvez pas utiliser lookbehind dans JavaScript.
Remarque 2. Lookbehnd , même si elle est interprétée correctement, dans la plupart des moteurs d'expressions régulières doit contenir une expression régulière de longueur fixe , que je ne garde pas dans l'exemple ci-dessus, car celle-ci est toujours valide et fonctionne pour les moteurs d'expressions régulières utilisé dans le moteur JavaScript de Google Chrome, JGsoft engine et Classes RegEx du framework .NET .
Remarque 3. Les lookbehind syntaxe ou sa Le remplacement de \ K est largement pris en charge par de nombreux moteurs d'expressions régulières utilisés dans un grand nombre de langages de programmation.
Plus d'explications sur les expressions régulières que j'ai utilisées, vous pouvez trouver par exemple ici .
@MusakkhirSayyed si vous avez besoin d'indices, d'explications ou de descriptions plus spécifiques, veuillez me le faire savoir
Je souhaite appliquer une approche générique pour rechercher un mot à partir d'un lien individuel en utilisant uniquement l'expression régulière. Non spécifique à l'exemple qui contient du texte / chiffre / domaine.
@MusakkhirSayyed votre question suggérait autre chose ... C'est dommage.
Mais merci pour ton commentaire @MusakkhirSayyed. Je mettrai à jour ma réponse à ce dont vous aviez exactement besoin. BDW: Si je vous ai bien compris, la réponse acceptée n'est pas ce dont vous aviez besoin.
Si le mot doit faire partie du chemin, vous pouvez utiliser filter en combinaison avec URL et vérifiez si les parties du chemin contiennent un mot.
https?://[^@w]*(?:@(?!@@)|w(?!ord)|[^@w]*)++word.*?(?=@@@|$)
Si vous souhaitez utiliser uniquement des expressions régulières et des quantificateurs possessifs sont pris en charge (la balise javascript a été supprimée) vous pouvez utiliser:
let str = 'https://www.test.com/text/1@@@https://www.test.com/text/word/2@@@https://www.test.com/text/text/word/3@@@https://www.test.com/3/text@@@https://www.test.com/word/3/text/text';
let filteredUrls = str.split("@@@")
.filter(s =>
new URL(s).pathname
.split('/')
.includes('word')
);
console.log(filteredUrls);
Pouvons-nous le résoudre uniquement par regex?
@MusakkhirSayyed J'ai mis à jour la réponse et ajouté une possible solution regex.
Essayons de construire une telle regex. Nous devons d'abord trouver le début de l'url:
/(https:\/\/(?:(?!@@@).)*word(?:(?!@@@).)*.(?=@@@|$))/g
Nous ajoutons ? après https pour les URL http .
Ensuite, nous devons trouver n'importe quel texte sauf @@@ , nous devons donc ajouter:
.(?=@@@|$)
ce qui signifie - tout nombre de caractères ne commençant pas une séquence @@@ .
Nous devons également ajouter à nouveau le mot lui-même et la sous-expression précédente, car le mot peut être entouré de n'importe quel texte:
word(?:(?!@@@).)*
Mais le fait est que la dernière sous-expression sautera le dernier caractère avant @@@ , nous devons donc ajouter une autre chose à gérer it:
(?:(?!@@@).)*
ce qui signifie - tout caractère suivi de @@@ ou de fin de chaîne. L'expression finale ressemblera à:
/(https?:\/\//
Mais je crois qu'il est préférable de simplement diviser le texte par @@@ puis de vérifier le mot nécessaire par String.prototype.includes.
Salut @Andres, Votre réponse est vraiment utile, pouvons-nous capturer le premier match, le deuxième match, etc.? '(https: \ / \ / (. (?! @@@)) * mot (. (?! @@@)) *. (? = (@@@) | $)) {premier / deuxième cond /troisième}'
J'ai résolu le problème courant dans l'utilisation d'un jeton gourmand tempéré, mais le /(https:\/\/(?:(?!@@@).)*word(?:(?!@@@ ).) *. (? = @@@ | $)) / g semble suspect en raison d'un . avant (? = @@@ | $) code >.
@ WiktorStribiżew Pouvons-nous capturer la deuxième / troisième / quatrième correspondance en passant le paramètre à regex?
@MusakkhirSayyed Non, pas à regex, mais vous pouvez facilement le faire avec Oracle SQL regexp_substr et des fonctions similaires dans d'autres alimentés par regex. Vous faites cela avec du code.
Vous pouvez probablement diviser sur
@@@et faire correspondre l'élément du tableau avec/ word /s.split ('@@@'). filter (x => x.indexOf ('/ word /')> 0)