2016-11-09 27 views
3

我想確定文件是否以零個或多個單行註釋(//樣式)開始,然後是「use strict」。Javascript正則表達式:找到第一個'嚴格使用'

這裏是我的嘗試:

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

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

我預計match.index爲0。但是,它實際上返回14,這意味着它不承認我的意見。我懷疑我沒有正確使用重複模式()*,但我不確定我應該使用什麼?

+0

東西可能不清楚。 '文件從零或更多的單行開始。那麼,「文件」? '第一'使用嚴格',第二個是什麼?如果你提供了你想要實現的結果(結果),那更好。 –

回答

3

問題是您的(\/\/.*\r?\n)*部件與註釋不匹配,因爲您沒有使用換行符,只能使用$聲明其存在。因此,組0的值是undefined(嘗試打印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);

我也建議使用正則表達式字面註釋/(\/\/.*\r?\n)*\"use strict\";/m而不是RegExp構造函數表示法,因爲您的模式是靜態的(沒有變量用於構建正則表達式)。

+0

啊,輝煌!我沒有意識到$沒有使用換行符。謝謝! – Wolf

+0

請注意,如果我問爲什麼'$'不消耗換行符? –

+1

因爲'$'是一個*零寬度斷言*。請參閱[*查看正則表達式引擎*](http://www.regular-expressions.info/anchors.html)。 –