2013-07-15 21 views
3

我對Javascript中的正則表達式有點新鮮。無法解析 - 用Javascript正則表達式

我試圖寫一個函數調用parseRegExpression() 其解析傳遞的屬性,並生成一個鍵/值對 它正常工作與輸入:

"iconType:plus;iconPosition:bottom;" 

但它不能解析輸入:

"type:'date';locale:'en-US';" 

基本上-符號被忽略。該代碼是:

http://jsfiddle.net/visibleinvisibly/ZSS5G/

正則表達式的key值對如下

/[a-z|A-Z|-]*\s*:\s*[a-z|A-Z|'|"|:|-|_|\/|\.|0-9]*\s*;|[a-z|A-Z|-]*\s*:\s*[a-z|A-Z|'|"|:|-|_|\/|\.|0-9]*\s*$/gi;  
+1

您不需要'[]'裏面的'|'字符充當「或」 – Ian

回答

0

有幾個問題:

  • 一個|字符類中是指文字|字符,而不是一個交替。
  • A .裏面的一個字符類意味着一個文字.字符,所以沒有必要轉義它。
  • A -作爲字符類中的第一個或最後一個字符表示文字-字符,否則它表示字符範圍。
  • 當您使用不區分大小寫的修飾符(i)時,不需要使用[a-zA-Z]; [a-z]就夠了。
  • 您的修改之間唯一的區別是最後一點;這可以通過將您的替代限制在不同的部分來顯着簡化。

這應該是等同於原來的模式:

/[a-z-]*\s*:\s*[a-z0-9'":_\/.-]*\s*(?:;|$)/gi 
0

替換代碼中的正則表達式如下:

regExpKeyValuePair = /[-a-z]*\s*:\s*[-a-z'":_\/.0-9]*\s*;|[-a-z]*\s*:\s*[-a-z'":-_\/.0-9]*\s*$/gi;    
regExpKey = /[-a-z]*/gi; 
regExpValue = /[-a-z:_\/.0-9]*/gi; 
  • 你不不需要逃跑。在[]之內。
  • 無需在元素[]之間放置|
  • 因爲您正在使用/i標誌,所以不需要[A-Z]。
  • -應該在開始或結束。
+0

嘗試,祈禱和希望?這是爲你編程嗎? – 6502

+0

@ 6502,我自己試了一下。對不起。我不擅長英語。 「嘗試」不是一個合適的詞嗎? – falsetru

+0

對不起,可能我反應過度了。但至少在談論正確性時,編程至少(或應該)像數學一樣。 「try」(「看看會發生什麼」)這個詞表明編程是不可預測的,學習編程的方式的確會讓你的代碼變得不可預測。有些地方嘗試看到的是唯一實用的解決方案(例如性能,特別是在微調領域),但這不是其中之一。 – 6502

0

可以避開正則表達式:

var test1 = "iconType:plus;iconPosition:bottom;"; 
var test2 = "type:'date';locale:'en-US';"; 

function toto(str) { 
    var result = new Array(); 
    var temp = str.split(';'); 
    for (i=0; i<temp.length-1; i++) { 
     result[i] = temp[i].split(':',1); 
    } 
    return result; 
} 

console.log(toto(test1)); 
console.log(toto(test2)); 
+0

如果密鑰或值需要能夠包含':',則此解決方案不起作用。 – 6502

+0

我不認爲鍵可以包含':',但是對於該值,我已經使用了split函數的limit參數。 –

+0

使用這種簡化的方法,該值不能包含';' – 6502

0

在字符集原子[...]管焦炭|只是一個普通的字符並不意味着「或」。

字符集原子列出您要接受的字符或範圍(或者如果字符集以^開頭並且隱含「or」則排除該字符或範圍。

你可以,如果你需要包括設置一個字符用一個反斜槓/排除閉括號]^標誌,即用於範圍破折號-,反斜槓\本身,不可打印的字符,或者如果你想使用指定代碼的非ASCII Unicode字符而不是逐字地。

然而,正則表達式的語法也可以讓你避免在字符集原子中的反斜槓轉義,方法是將字符放在一個不能有特殊含義的位置......例如破折號-作爲集合中的第一個或最後一個(它不能代表那裏的範圍)。

還要注意的是,如果你需要能夠匹配的值引號的字符串,包括反斜槓,正則表達式是比較複雜的,例如

'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*" 

一個單引號或雙引號字符串匹配包括反斜槓的含義之中:

  • 單引號'
  • 零個或多個的任:
    • 除了單引號'或反斜槓任何炭\
    • 一對隨後的任何焦炭
  • 單引號'

或用雙引號"相同反斜槓\組成代替。

注意的是,集團已分隔的(?:...)而不是純(...)避免捕獲

0

,因爲它解釋|-|爲開始於||結束的範圍不匹配連字符。 (我本來期望的是被視爲一個語法錯誤,但你有它它工作在每一個正則表達式的味道,我已經試過了一樣,太。)

看一看這個表達式:

/(?:^|;)([a-z-]*)\s*:\s*([a-z'":_\/.0-9-]*)\s*(?=;|$)/ig 

正如其他響應者所建議的那樣,我將它摺疊爲一個替代方案,移除不需要的管道,並通過將連接符移動到最後逃脫。我還將它在開始和結束時都加以錨定。無論如何,或者我可以將它錨定。我使用了前瞻來匹配尾部的分號,所以在下一場比賽開始時它仍然會在那裏。這遠非萬無一失,但只要投入結構合理,它應該可以正常工作。