2013-05-13 65 views
1

我想解析Javascript中的!Name=John OR !Address="1234 Place Lane" AND tall,如果前面有!或其他簡單字符串,則將「參數」提取爲鍵/值。示例代碼如下:正則表達式解析可能引用表示的參數

1 var input = '!Name=John OR !Address="1234 Place Lane" AND tall'; 
2 var params = input.match(/.../g); // <--?? what is the proper regex? 
3 var i = params.length; 
4 while(i--) { 
5 params[i] = params[i].replace(/"/g.""); 
6 if(params[i].indexOf("!")==0) { 
7  params[i] = params[i].substring(1); 
8  // Address=1234 Place Lane 
9  var position = params[i].indexOf('='); 
10  var key = params[i].substring(0,position); 
11  var value = params[i].substring(1+position); 
12  params[i] = {"key": key, "value": value}; 
13  // {key: "Address", value: "1234 Place Lane"} 
14  // {key: "Name", value: "John"} 
15 } 
16 } 
17 // params = [ {key:"Name",value:"John"}, "OR", {...}, "AND", "tall" ]; 

相關問題:javascript split string on space or on quotes to array

+3

這種問題通常更好地解決一個狀態機,只是通過字符串通過char收集它遇到的碎片。 – jfriend00 2013-05-13 14:19:15

+0

是否可以使用'json'而不是字符串解析? – 2013-05-13 14:19:15

+1

*分隔關鍵字*只能是「或」或「與」?如果是的話,我寧願將它們拆分並解析每個子字符串,而不是使用複雜的正則表達式。 – sp00m 2013-05-13 14:30:00

回答

3

說明

考慮一個正則表達式的下面的powershell例子。

(?i)(?:\sor\s|\sand\s|^)!?([^=]*)(?:=?["]?([^"]*)["]?)?(?=\sor\s|\sand\s|$)see also link

$Matches = @() 
$String = '!Name=John OR !Address="1234 Place Lane" AND tall' 
Write-Host start with 
write-host $String 
Write-Host 
Write-Host found 
([regex]'(?i)(?:\sor\s|\sand\s|^)!?([^=]*)(?:=?["]?([^"]*)["]?)?(?=\sor\s|\sand\s|$)').matches($String) | foreach { 
    write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'`t= value at $($_.Groups[2].Index) = '$($_.Groups[2].Value)'" 
    } # next match 

息率

start with 
!Name=John OR !Address="1234 Place Lane" AND tall 

found 
key at 1 = 'Name' = value at 6 = 'John' 
key at 15 = 'Address' = value at 24 = '1234 Place Lane' 
key at 45 = 'tall' = value at 49 = '' 

摘要

您將需要繼續使用原來的邏輯,你正在做的鍵/值組和構建你的價值集和測試看有沒有價值實際上存在

enter image description here

  • (?i)確保案件不敏感
  • (?:\sor\s|\sand\s|^)需要一個字符串的開頭開始,「或」,或者「和」。兩者「或」與「和」需要一個空格
  • !?消耗exclamination點,如果它存在
  • ([^=]*)回報這是不相等的跡象
  • (?:所有字符開頭的非捕獲組包圍
  • =?消耗,如果它存在
  • ["]?消耗的報價,如果它使用貪婪搜索
  • 存在
  • ([^"]*)捕獲所有非引用等號
  • ["]?消耗的報價,如果它存在
  • )關閉非捕獲組
  • ?使不需要
  • (?=\sor\s|\sand\s|$)搜索下「和」整個非捕獲組,「或」,或結束串。這迫使貪婪捕獲停止在和/或/和/或斷開尾部
+0

你用什麼工具生成圖表? – sp00m 2013-05-13 20:24:32

+0

嘿sp00m,我用http://www.debuggex.com/這是更快,更實時然後http://www.regexper.com/。但他們都是大致相同的事情。 – 2013-05-13 20:32:43