1
votes

regex pour extraire le nombre et la date de la chaîne

J'essaie d'extraire la date, le pourcentage ou le nombre d'une chaîne. Les chaînes peuvent être:

  1. la valeur de réponse 10 (à partir de là, je veux en extraire 10)
  2. la valeur de la réponse 10/12/2014 (à partir de là, je veux extraire 10/12/2014)
  3. la valeur de la réponse 08/2015 (à partir de là, je veux extraire 08/2015)

J'ai écrit l'expression régulière comme (?: \ d {2} \ / \ d {4} | \ d {2} (?: \ / \ d {2} \ / \ d {4} )?) Regex est satisfaisant 12/12/2014, 10, 02/2012.

J'essaie également de modifier la même expression régulière pour obtenir 10, 08/2015 et 10/10/2015, mais je ne sais pas comment l'obtenir.

Comment y parvenir?


2 commentaires

Pourriez-vous fournir une liste de valeurs que vous souhaitez faire correspondre? Votre expression régulière actuelle ne correspond pas à 12/12/2014 comme vous le prétendez, pour correspondre à 12/12/2014 , vous auriez besoin de (\ d {2} ) [\ /] (\ d {2}) [\ /] (\ d {4})


Vous pouvez utiliser une alternative pour faire correspondre les 3 formats \ b (?: \ D {2} \ / \ d {4} | \ d {2} (?: \ / \ D {2} \ / \ d {4})?) \ B regex101.com/r/xqApkK/1 Notez que 4 chiffres correspondent également à 9999


3 Réponses :


0
votes

La méthode Match prend en charge regExp et renverra un tableau avec les éléments que vous recherchez:

var date = "12/12/2014"

	var arr = date.match(/(\d{2})[\/](\d{2})[\/](\d{4})/);

	console.log(arr[0]);
	console.log(arr[1]);
	console.log(arr[2]);
	console.log(arr[3]);


0 commentaires

2
votes

Pour faire correspondre vos données d'exemple, vous pouvez utiliser une alternance correspondant à 2 chiffres / 4 chiffres, ou faire correspondre 2 chiffres avec une partie facultative qui correspond à 2 chiffres et 4 chiffres.

const pattern = /\b(?:\d{2}\/\d{4}|\d{2}(?:\/\d{2}\/\d{4})?)\b/;
[
  "the response value 10",
  "the response value 10/12/2014",
  "the response value 08/2015"
].forEach(s => console.log(s.match(pattern)[0]));

Explication

  • \ b Limite de mot, empêche le mot char de faire partie d'un mot plus grand
  • (?: Groupe sans capture
    • \ d {2} \ / \ d {4} Faire correspondre 2 chiffres / 4 chiffres
    • | Ou
    • \ d {2} Faire correspondre 2 chiffres
    • (?: \ / \ d {2} \ / \ d {4})? Correspondance facultative / 2 chiffres / 4 chiffres
  • ) Fermer le groupe
  • \ b Limite de mot

Démo Regex

Remarque que 2 et 4 chiffres peuvent également correspondre à 99 et 9999. Si vous souhaitez rendre votre correspondance plus précise, cette page peut être utile https://www.regular-expressions.info/dates.html

\b(?:\d{2}\/\d{4}|\d{2}(?:\/\d{2}\/\d{4})?)\b


5 commentaires

Je pense que \ b (?: (?: \ D \ d \ /) {1,2} \ d {4} | \ d \ d) \ b serait une bonne alternative ? Que pensez-vous de cela? Je ne suis pas encore assez familier avec les regex pour faire la différence dans les performances des groupes imbriqués sans capture.


@JvdV C'est plus court :-)


Si tel est le cas, n'hésitez pas à l'utiliser. Sinon je le posterai comme alternative. J'ai également lu quelque part que \ d \ d battrait \ d {2} en performance. Que pensez-vous de cela? Je ne sais pas si c'est là que je devrais vous poser ces questions. Mais je trouve ça intéressant =)


@JvdV Du fond de mon esprit, je ne saurais pas. Les moteurs peuvent également pré-optimiser le modèle, de sorte que le nombre d'étapes n'est pas toujours une garantie de performance. La plupart du temps, je regarde les données et vérifie quelle est la moindre quantité de travail, donc ne pas déclencher le moteur si vous savez d'avance que cela ne donnera pas de match. Cette page contient des informations intéressantes sur les optimisations rexegg.com/regex-optimizations.html Aussi À mon humble avis, le livre Mastering Regular Expressions chapitre 4-6 contient de belles informations à ce sujet.


Je crois aussi la même chose en ce qui concerne les étapes comme seule référence (elles sont utiles mais pas toujours). Ce message pourrait être utile.



1
votes

Juste pour le plaisir (regex est amusant) une alternative à la réponse acceptée:

\b\d\d(?:(?:\/\d\d){1,2}\d\d)?\b

Voir le Démo en ligne

  • \ b - Correspond à une limite de mot.
  • (?: - 1er groupe non capturant.
    • (?: - 2e groupe non capturant.
      • \ d \ d \ / - Correspond à deux chiffres et à une barre oblique littérale.
      • ) {1,2} - Fermez le deuxième groupe sans capture et utilisez-le une ou deux fois.
    • \ d {4} - Faites correspondre quatre chiffres.
    • | - Alternance (OR).
    • \ d \ d) - Deux chiffres et fermer le 1er groupe non capturant.
  • \ b - Correspond à une limite de mot.

 entrez la description de l'image ici


Peut-être que nous pouvons le faire même sans alternance:

\b(?:(?:\d\d\/){1,2}\d{4}|\d\d)\b
  • \ b - Correspond à une limite de mot.
  • \ d \ d - Faites correspondre deux chiffres.
  • (?: - 1er groupe non capturant.
    • (?: - 2e groupe non capturant.
      • \ / \ d \ d - Correspond à une barre oblique littérale et à deux chiffres.
      • ) {1,2} - Fermez le deuxième groupe sans capture et utilisez-le une ou deux fois.
    • \ d \ d - Faites correspondre deux chiffres.
    • )? - Fermez le premier groupe non capturant et rendez-le facultatif.
  • \ b - Correspond à une limite de mot.

 entrez la description de l'image ici


0 commentaires