2013-05-13 104 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