1
votes

Regex pour faire correspondre le chemin exact avec deux /

J'essaie de faire correspondre le chemin ci-dessous avec une expression régulière.

(\/content\/[a-z-]+)\/[a-z]{2}_[A-Z]{2}\/book(ing-path)?\/(sample-|sample-details)(.*).[0-9]{5}.*

/content/test-site is optional- it might not present sometimes in url.

La règle d'expression régulière actuelle (\ / content \ / {1} \ S +) aurait été adéquate.

Le problème est qu'il correspond au chemin complet tel que /content/test-site/en_US/abc.html.

J'ai besoin il doit correspondre uniquement à /content/test-site.

Exemple de chemin à rechercher:

https://localhost:4502/content/test-site/en_US/book/city/sample-rooms/airport-inn/propertyCode.00000.html

Regex I ' J'ai essayé de loin;

# test-site could be anything like "shoe-site", "best-clock", etc.
/content/test-site

Qu'est-ce que je fais de mal et comment puis-je y remédier?


5 commentaires

Si "test-site" se compose toujours de deux mots (alphanumériques ou soulignés) séparés par - , vous pouvez utiliser \ / content \ / \ w + - \ w + . Consultez-le ici: regex101.com/r/vjx05U/1 . Si cela peut être autre chose que / , vous pouvez utiliser \ / content \ / [^ /] + . Veuillez noter que {1} est redondant.


Remplacez simplement \ S + par [^ \ /] +


Mach pour la répétition de caractères. Voir ici stackoverflow.com/questions/1023902/...


soo ... correspondez-vous à une URL complète ou simplement au chemin? Parce que votre exemple de "chemin à rechercher" est une URL complète ...


@CrayonViolent juste le chemin - pas l'URL complète. parfois, il aurait / content / test-site, parfois non. / fr_US / ... etc.


3 Réponses :


1
votes

Regex pour correspondre à n'importe quel caractère attendu /:

const url = '/content/test-site/en_US/abc.html';

const path = url.match(/content\/[^\/]+/)

console.log(path[0])

Il s'agit de classes de caractères. Une classe de caractères commençant par un signe d'insertion correspondra à tout ce qui n'est pas dans la classe. En savoir plus à ce sujet.

Donc, avec javascript: p>

content\/[^\/]+


0 commentaires

1
votes

Voici une autre approche:

(?:                 # Non-capturing group
\/[a-zA-Z0-9-]+     # Match starting with / and followed with characters/digits/-
)                   # Close grouping
{2}                 # Match two times, i.e. only match with two /

Démo Regex a >

Explication:

(?:\/[a-zA-Z0-9-]+){2}


7 commentaires

Pourquoi avez-vous supposé que le «contenu» n'était pas une constante?


@AhmedAbdelhameed dans la question, il ne mentionne nulle part que le contenu est une constante. Et si ce n'est pas le cas? On ne sait pas, je laisse ça à OP pour décider. Ma réponse n'est qu'une des approches possibles.


Le PO l'a utilisé comme constante (c'est-à-dire dans son modèle). Je ne supposerais pas le contraire, mais c'est peut-être juste moi :)


@AhmedAbdelhameed Je vois votre point, je ne pense pas que ma réponse fasse de mal cependant, si OP confirme que c'est une constante, je supprimerai la réponse, pas de problème.


@AhmedAbdelhameed merci pour la réponse. pouvez-vous me dire?: pourquoi cela est nécessaire? Merci.


@Sri ceci est un groupe non capturant, voir ici stackoverflow.com/questions/3512471/...


/ content / test-site est facultatif, dans l'expression régulière ci-dessus, il dit +, je ne suis pas sûr si je pourrais faire un groupe entier zéro ou une fois.



1
votes

Vous pouvez utiliser la classe de caractères annulés

const path = '/content/test-site/en_US/abc.html';

const desired = path.match(/^(?:[^\/]*\/){2}[^\/]*/)

console.log(desired[0])

entrez la description de l'image ici

^(?:[^\/]*\/){2}[^\/]*


0 commentaires