2015-11-10 65 views
1

我正在爲RegExp結果而苦苦掙扎。基本上我想要的是一個startIndex,它給出了與源字符串相關的每個匹配的確切位置。因此,而不是用繩子如何獲得我RegExp中每場比賽的startIndex

var regex = /(?:\w*) from "(\w*)"/g 
var result = regex.exec('import foo from "foo"'); 
console.log(result.slice(1)) // => ["foo"] 

一個數組,我想有一個對象是這樣的:

[{ 
    value: 'foo', 
    startIndex: 17 
}] 

我不認爲這是可能的,而無需使用特殊的庫,所以我的問題是:

您是否知道任何返回更精確的匹配信息或任何其他解決方案的庫如何解決?

注意這只是RegExp的一個例子。在真正的應用程序中,我將擁有10多個完全不同的RegExp。因此,動態方法是首選。

加成

我需要這個了GitHub Linker的下一個主要版本。目前,鏈接替換是通過一個jQuery選擇器來完成的,這不是那麼靈活,有時也是錯誤的。 RegExp有望減少開銷,因此其他開發人員可以使用Ruby,Python等其他語言輕鬆擴展GitHub Linker ....目前只支持JavaScript。

這就是爲什麼我要尋找一個堅實而靈活的解決方案。

- 感謝

+1

@PaulRoub:我不認爲這是一個重複的,哪些是你的鏈接回答了這個問題。 –

+0

@PaulRoub鏈接中提供的解決方案將工作,如果字符串不會包含兩次'foo'。所以找到正確的位置並不容易。 – stefanbuck

+1

@stefanbuck:我作爲評論者參與了這個問題,並且我確信這是您可以從JavaScript有限的API中獲得的最佳選擇。 – nhahtdh

回答

-1

接受的答案here似乎接近。我已經在下面調整了它,它似乎接近需要的東西。

var str = 'import foo from "foo" import bar from "bar"' 
 
var regex = /(?:\w*) from "(\w*)"/g; 
 
var output = []; 
 
while ((result = regex.exec(str))) { 
 
    var offset = result[0].lastIndexOf(result[1]); 
 
    output.push('Value: ' + result[1] + ', startIndex: ' + (result.index+offset)); 
 
} 
 

 
document.getElementById('results').innerHTML = output;
<div id="results"></div>

+0

OP需要捕獲組1的起始索引,而不是整個匹配的起始索引(由exec返回)。 – nhahtdh

+0

Mhhh ...如果RegExp在末尾不包含self自身,例如: var str ='從foo'導入foo' var regex = /(?:\ w *)從「(\ w *)」foo/g;'''我不確定這是否是我用例中的一個大問題...我必須檢查它。 – stefanbuck

+0

@stefanbuck你可以使用來自「(\ w *)」(?= \ 1)的正向預測'(?:\ w *)' – Kerwin