2017-05-27 7 views
0

J'essaie d'extraire toutes les chaînes passées à une fonction require à partir de fichiers javascript avec une simple regex.extrait du texte entre deux chaînes avec perl style regex (ocaml-re)

Exemple

var x = require("./something.js"); 
var y = require("./else.js"); 
console.log(other); 
require("test.js"); 

Sur ce dossier, je veux extraire: ["./something.js", "./else.js", "test.js"].

j'ai réussi à écrire l'expression rationnelle suivante: "require\(\"(.*?)\"\)";

J'utilise ocaml-re pour compiler le regex style perl et correspondre à une chaîne comme:

let everything = Re.all regex js; 

let() = 
    List.iter 
    (
     fun group -> 
     let g = Re.Group.all group in 
     Array.iter (fun s -> print_endline s) g 
    ) everything 

Il imprime les éléments suivants:

require("./something.js") 
./something.js 
require("./else.js") 
./else.js 
require("test.js") 
test.js 

Comment est-ce que je change l'expression rationnelle pour obtenir seulement le ./something.js, ./else.js, test.js?

+2

Pourquoi vous imprimer tous les groupes avec Array.iter? Le groupe 0 est toujours le match complet. Ici, vous semblez seulement intéressé par le groupe 1. – Drup

+0

Vous avez tout à fait raison, je ne sais pas pourquoi je n'ai pas pris le groupe à l'index 1 ... – Seneca

Répondre

0

Vous pouvez extraire uniquement le texte entre les citations en utilisant cette expression rationnelle:
(?<=require\(\").*?(?=\"\))

  • (?<=require\(\") est un aspect-behind positif pour la chaîne require (»
  • .*? correspond à tout sauf nouvelle ligne paresseusement (aka avec aussi peu de caractères que possible)
  • (?=\"\)(?=\"\) est un aperçu positif pour la chaîne ")
+0

Regardez en avant/derrière sont complètement inutiles ici. L'expression rationnelle d'OP est en fait meilleure que la vôtre. – Drup

+0

OP veut une solution dans Ocaml, pas Perl. – Toto

0

Le groupe 0 est la chaîne entière, et en raison de Array.iter vous l'imprimez également. Vous pouvez remplacer

let g = Re.Group.all group in 
Array.iter (fun s -> print_endline s) g 

par

match Re.Group.all group with 
| [| _ ; s |] -> print_endline s 
| _ ->() 

(ou utiliser un test Array.length si vous préférez que pour pattern matching)