2012-06-27 312 views
5

問題很簡單。我有一個包含其嵌入在單引號多個元素的字符串:解析引用字符串的簡單正則表達式

var str = "'alice' 'anna marie' 'benjamin' 'christin'  'david' 'muhammad ali'" 

我想分析它讓我有數組中的所有那些名字:

result = [ 
'alice', 
'anna marie', 
'benjamin', 
'christin', 
'david', 
'muhammad ali' 
] 

目前我「使用此代碼來完成這項工作:開始

var result = str.match(/\s*'(.*?)'\s*'(.*?)'\s*'(.*?)'\s*'(.*?)'/); 

但這正則表達式是太長,它不靈活,所以如果我在str串更多的元素,我必須編輯正則表達式。

什麼是最快和最有效的解析方法?性能和可靠性在我們的Web應用程序中非常重要。

我已經看過下面的問題,但他們不是我的答案:

回答

8

定義模式一次,並使用全球g標誌。

var matches = str.match(/'[^']*'/g); 

如果不想他們周圍的單引號標記,正常的做法是使用正則表達式中的子匹配 - 但JavaScript不支持子組捕獲使用g標誌時。解決這個問題的最簡單的(儘管不一定是最有效)的方法是事後除去它們,反覆:

if (matches) 
    for (var i=0, len=matches.length; i<len; i++) 
     matches[i] = matches[i].replace(/'/g, ''); 

[編輯] - 作爲其他的答案說,你可以使用split()代替,但前提是你可以依靠在你的字符串中每個標記之間總是有一個空格(或者一些共同的分隔符)。

0

單程;

var str = "'alice' 'benjamin' 'christin' 'david'"; 
var result = {}; 

str.replace(/'([^']*)'/g, function(m, p1) { 
    result[p1] = ""; 
}); 

for (var k in result) { 
    alert(k); 
} 
1

當一個正則表達式對象具有的global標誌設置,你可以多次執行它針對的字符串找到所有匹配。它的工作原理開始在上次運行最後匹配字符之後的下一個搜索:

var buf = "'abc' 'def' 'ghi'"; 
var exp = /'(.*?)'/g; 
for(var match=exp.exec(buf); match!=null; match=exp.exec(buf)) { 
    alert(match[0]); 
} 

就個人而言,我覺得它解析字符串的一個真正好方法。

編輯:表達/'(.*?)'/g匹配單引號之間的任何內容('),所述改性劑*?是非貪婪和它極大地簡化了圖案。

1

一種不同的方法

我來到這裏需要的是可以解析的報價和非引號的字符串,保存報價與非報價的順序,然後用它們纏特定的標記,反應或做出反應其輸出的方法原生所以我最終沒有在這裏使用答案,因爲我不知道如何讓他們適應我的需要,然後做了這個。

function parseQuotes(str) { 
    var openQuote = false; 
    var parsed = []; 
    var quote = ''; 
    var text = ''; 
    var openQuote = false; 

    for (var i = 0; i < str.length; i++) { 
    var item = str[i]; 
    if (item === '"' && !openQuote) { 
     openQuote = true; 
     parsed.push({ type: 'text', value: text }); 
     text = ''; 
    } 
    else if (item === '"' && openQuote) { 
     openQuote = false; 
     parsed.push({ type: 'quote', value: quote }); 
     quote = ''; 
    } 
    else if (openQuote) quote += item; 
    else text += item; 
    } 

    if (openQuote) parsed.push({ type: 'text', value: '"' + quote }); 
    else parsed.push({ type: 'text', value: text }); 

    return parsed; 
} 

,鑑於此,當:

'Testing this "shhhh" if it "works!" " hahahah!' 

產生:

[ 
    { 
    "type": "text", 
    "value": "Testing this " 
    }, 
    { 
    "type": "quote", 
    "value": "shhhh" 
    }, 
    { 
    "type": "text", 
    "value": " if it " 
    }, 
    { 
    "type": "quote", 
    "value": "works!" 
    }, 
    { 
    "type": "text", 
    "value": " " 
    }, 
    { 
    "type": "text", 
    "value": "\" hahahah!" 
    } 
] 

,讓您可以輕鬆地環繞它的標籤取決於它是什麼。

https://jsfiddle.net/o6seau4e/4/