2017-01-21 39 views
2

有人幫我寫正則表達式是以下情況正則表達式提取括號和函數名

  • somestring()=>['somestring']
  • somestring()[10] =>['somestring','',10]
  • somestring(」 argString ')=>['somestring', 'argString']
  • somestring(' argString ')[10] =>['somestring', 'argString',10]
  • somestring({PROP1:' V1' ,PROP2: 'V2'})=>['somestring', {prop1:'v1',prop2:'v2'}]

  • somestring({PROP1: 'V1',PROP2: 'V2'})[100] =>['somestring', {prop1:'v1',prop2:'v2'},100]

這是我嘗試到目前爲止

var regExp = /\b[^()]+\((.*)\)+\[(.*?)]/; 
var matches = regExp.exec('somestring()[10]'); 
+0

爲什麼你使用regexp來解碼看起來像JS的東西?你打算如何處理結果?你需要像'somestring(foo(bar))',或'somestring(foo [10](bar))',或'somestring(foo(bar)[10])',或'somestring({ prop1:foo(bar)[10]})'? –

+0

@torazaburo paranthesis任何東西都可以在那裏,我唯一的擔心就是隻是獲取內容 – Shafeeque

+0

內的內容在這種情況下,使用正則表達式將會非常困難,因爲regexp不能很好地處理嵌套語法。你能否在我們的問題中增加一個這樣的例子,以便其他人回答測試用例是否有效?一個小小的解析器可能對你更好。 –

回答

2

可以工作:

var input = ['somestring()', 'somestring()[10]', "somestring('argString')", "somestring('argString')[10]", "somestring({prop1:'v1',prop2:'v2'})", "somestring({prop1:'v1',prop2:'v2'})[100]"]; 

console.log(input.map(function(v) { 
    let result = v.match(/(.*)\((.*)\)(\[([^\]]*)\])?/); 

    return [result[1], result[2], result[4]]; 
})); 
1

你只需要排除右括號:

​​

如果您擁有如下所示的字符串,則會中斷:

somestring({myKey: myFunc()})[myArray[0]] 
+0

您的正則表達式不適用於所有情況 – smnbbrv

2

可以否定()[]從匹配

let re = /[^()\[\]]+/g; 

let res = "somestring({prop1:'v1',prop2:'v2'})[100]".match(re); 
+0

謝謝,如果函數paranthesis中沒有參數,是否可以添加空值? – Shafeeque

0

我會嘗試與Proxy來處理這個問題,如下所示:

const somestring = new Proxy(() => {}, { 
    apply(target, thisArg, [arg = '']) { 
    return new Proxy(['somestring', arg], { 
     get(target, prop) { 
     if (!isNaN(String(prop))) return [...target, prop]; 
     return target[prop]; 
     } 
    }); 
    } 
}); 

console.log(
    somestring(), 
    somestring()[10], 
    somestring('argString'), 
    somestring('argString')[10], 
    somestring({prop1:'v1',prop2:'v2'}), 
    somestring({prop1:'v1',prop2:'v2'})[100] 
); 

這適用於節點,但不適用於Chrome devtools控制檯,因爲當使用console.log序列化到控制檯時,後者明顯嘗試調用每個元素上的get

節點輸出:

[ 'somestring', '' ] 
[ 'somestring', '', '10' ] 
[ 'somestring', 'argString' ] 
[ 'somestring', 'argString', '10' ] 
[ 'somestring', { prop1: 'v1', prop2: 'v2' } ] 
[ 'somestring', { prop1: 'v1', prop2: 'v2' }, '100' ] 

這裏的基本思想是創建一個功能的代理,其被調用時(apply)返回['somestring', arg]陣列,而且還環繞該後者會捕獲屬性訪問代理(get)如[10],在這種情況下返回['somestring', arg, 10]