2017-05-27 12 views
0

私はjavascriptファイルからrequire関数に渡されたすべての文字列を単純な正規表現で抽出しようとしています。 ["./something.js", "./else.js", "test.js"]:私が抽出したい、このファイルのうちperlスタイルの正規表現(ocaml-re)で2つの文字列の間でテキストを抽出します

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

私は、次の正規表現を記述するために管理:"require\(\"(.*?)\"\)";

私はPerlスタイルの正規表現をコンパイルした文字列に一致するようにocaml-reを使用していますように:それは次のように出力さ

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 

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

正規表現を変更して./something.js, ./else.js, test.jsのみを取得するにはどうすればよいですか?

+2

を置き換えることができますか?グループ0は常に完全一致です。ここでは、あなたはグループ1だけに興味があるようです。 – Drup

+0

なぜ、私はちょうどインデックス1のグループに参加しなかったのか全くわかりません。 – Seneca

答えて

0

あなたは、この正規表現を使用して引用の間でテキストだけを抽出できます。
(?<=require\(\").*?(?=\"\))

  • (?<=require\(\")を文字列ための正ルックの背後には、
  • .*?を遅延改行以外のすべてに一致する「(必要とされます(可能な限り少ない文字で)
  • (?=\"\)は、文字列「」の正の先読みです。」
+0

先を見ている/後ろを見ることは完全に不要です。 OPの正規表現は実際にあなたよりも優れています。 – Drup

+0

OPはPerlではなくOcamlのソリューションを求めています。 – Toto

0

グループ0は文字列全体であり、Array.iterのためにも印刷されます。あなたはArray.iterですべてのグループを印刷しないのはなぜ

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

(またはあなたがパターンマッチングにいることを好む場合Array.lengthテストを使用)によって

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

関連する問題