1

私は!Name=John OR !Address="1234 Place Lane" AND tallJavascriptで解析しようとしています.「パラメータ」!が前にある場合はキー/値として抽出し、そうでない場合は単純な文字列として抽出します. コード例は次のとおりです。

 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」、または文字列の末尾を検索します。これにより、貪欲なキャプチャが and/or/endofstring ブレークで強制的に停止されます。
于 2013-05-13T16:49:39.387 に答える