2013-05-13 2 views
1

Я пытаюсь разобрать !Name=John OR !Address="1234 Place Lane" AND tall в Javascript, извлекая «параметры» в качестве ключа/значения, если у них есть ! спереди и в остальном как простая строка. Пример кода ниже:Регулярное выражение для синтаксического анализа возможных значений котировки

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

Этот вид проблемы, как правило, лучше решать с помощью конечного автомата, который просто просматривает строковый символ, который собирает части, которые он встречает. – jfriend00

+0

Возможно ли использовать 'json', а не синтаксический анализ строк? –

+1

* Отделяющие ключевые слова * могут быть только 'OR' или' AND'? Если да, я бы предпочел разделить их и проанализировать каждую подстроку, вместо использования сложного регулярного выражения. – sp00m

ответ

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|$) поиск следующего «и», «или», или конец строка. Это заставляет жадный захват останавливаться при перерывах и/или/endofstring
+0

Какой инструмент вы использовали для создания графика? – sp00m

+0

Эй, sp00m, я использовал http://www.debuggex.com/, который немного быстрее и больше в реальном времени, чем http://www.regexper.com/. Но они оба примерно к одному и тому же. –

Смежные вопросы