1

我正在尝试!Name=John OR !Address="1234 Place Lane" AND tall用Javascript进行解析,如果“参数”前面有a,则提取“参数”作为键/值!,否则提取为简单字符串。示例代码如下:

 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在空格或引号上拆分字符串到数组

4

1 回答 1

3

描述

考虑以下正则表达式的 powershell 示例。

(?i)(?:\sor\s|\sand\s|^)!?([^=]*)(?:=?["]?([^"]*)["]?)?(?=\sor\s|\sand\s|$) 另见链接

例子

$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 = ''

概括

您将需要继续使用原始逻辑,在该逻辑中获取键/值集并构建值集并测试以查看值是否实际存在

在此处输入图像描述

  • (?i)确保不区分大小写
  • (?:\sor\s|\sand\s|^)需要以字符串开头的开头,“or”或“and”。"or" 和 "and" 都需要用空格包围
  • !?如果存在感叹号,则使用它
  • ([^=]*)返回所有不等号的字符
  • (?:启动非捕获组
  • =?如果存在则使用等号
  • ["]?使用报价(如果存在)
  • ([^"]*)使用贪婪搜索捕获所有非引号
  • ["]?使用报价(如果存在)
  • )关闭非捕获组
  • ?使整个非捕获组不需要
  • (?=\sor\s|\sand\s|$)搜索下一个“and”、“or”或字符串结尾。这会强制贪婪捕获在和/或/endofstring 中断处停止
于 2013-05-13T16:49:39.387 回答