2016-11-09 6 views
3

ファイルが0個以上の単一行コメント(//スタイル)で始まり、その後に "use strict"が続くかどうかを調べたいと思います。ここでJavascript regex:最初の 'use strict'を見つけよう

は私の試みです:

var regex = new RegExp("(\/\/.*$)*\"use strict\";", 'm'); 
var codeblock = 
` 
//hi 
//there 
"use strict"; 
`; 

let match = regex.exec(codeblock); 
console.log(match.index); 

私はしかし、それは実際にそれが私のコメントを認識しないという意味、14を返しmatch.indexが0であることを期待したいです。繰り返しパターン(*)*を正しく使用していないと思われますが、私は何を使用するべきかわかりません。

+0

何かが不明確な場合があります。 'ファイルは0個以上の単一行で始まります。それで、ファイル? '最初の '厳密な使用'、第2は何ですか?達成したい文字列(結果)を提供する方が良いでしょう。 –

答えて

3

重要な点は、あなたが$であることを主張しているに過ぎません。改行を消費していないため、あなたの(\/\/.*\r?\n)*の部分がコメントと一致しません。したがって、グループ0の値はであり、定義されていない(試し印刷match[1])であり、その一致は位置14にあります。つまり、"use strict"です。

\r?\n$を交換し、あなたがテスト文字列の先頭に何の改行を持っていない、とあなたが0を取得することを確認してください。

var regex = /(\/\/.*\r?\n)*\"use strict\";/m; 
 
var codeblock = 
 
`//hi 
 
//there 
 
"use strict";`; 
 
let match = regex.exec(codeblock); 
 
console.log(match.index);

私もリテラル正規表現を使用することをお勧めあなたのパターンは静的なので(RegExを構築するための変数はありません)、RegExpコンストラクタの表記ではなく、/(\/\/.*\r?\n)*\"use strict\";/mという表記法を使用します。

+0

ああ、素晴らしい!私は$が改行を消費しなかったことに気付かなかった。ありがとう! – Wolf

+0

なぜ '$'が改行を消費しないのか尋ねると気になりますか? –

+1

'$'は*ゼロ幅アサーション*です。 [* Regexエンジンの内部を見る*](http://www.regular-expressions.info/anchors.html)を参照してください。 –

関連する問題