2014-12-22 3 views
0

я следующая строка, которая приходит из устройства AVLRegex для разбора сообщение AVL устройства

201412211732-34.20333,-56.23234 value1=pair1;value2=pair2;valueN=pairN 

Формат предоставляемых производителем устройства является

Fixed Part 
---------- 
0-8    Date 
9-12    Time 
up to comma  Latitude 
up to space  Longitude 

Options Part 
------------- 
up to eq   Option Name 
up to semicolon Option Value 

* The message can have 0 or more Options. 
** The last option could end not with a semicolon. 

Я написал некрасивый функцию для разбора это сообщение. Я не парень с регулярным выражением, но я бы хотел использовать регулярное выражение. Я могу оценить его простоту.

Может ли кто-нибудь поставить меня в правильном направлении?

btw: в javascript.

EDIT:

Я хочу получить дополнительную часть тоже, но расщепляется в качестве ключевой пары, является его Возможное?

ответ

1

Используйте группы захвата, чтобы захватить подстроки, которые вы хотите.

^(\d{8})(\d{4})([^,\n]+),([^\s\n]+)\s?(?:[^\n=]+=[^\n;]+)?(?:;(?:[^\n=]+=[^\n;]+))*$ 

DEMO

  • ^ Утверждает, что мы находимся в самом начале.
  • \d{8} Соответствует точно 8 цифрам.
  • [^\s\n] Отрицательный класс символов, который соответствует любому символу, но пробелу или символу новой строки.
  • $ Утверждается, что мы находимся в конце.

Используйте это регулярное выражение, если вы хотите также взять дополнительные значения.

^(\d{8})(\d{4})([^,\n]+),([^\s\n]+)\s?((?:[^\n=]+=[^\n;]+)?(?:;(?:[^\n=]+=[^\n;]+))*)$ 

DEMO

+0

match1, не соответствует опциональные значения почти в демо –

+0

сделали вы хотите, чтобы захватить дополнительные значения –

+0

да жаль, если я был ип Чисто. –

1

Авинаш Радж ответ хорош, я пошел с:

^(\d{8})(.{4})([^,]+),([^\s]+)\s(.*)$ 

и оставил Валу = одни пары, как там может быть 0 или больше вариантов. Я разделил бы их на js на ;, затем на петлю, чтобы получить данные. js regex не рекурсию :(

дата, время, широта и долго в захваченных групп \ 1, \ 2, \ 3 и \ 4 соответственно.

1

Вы можете разобрать приставку первой, а затем сделать петля над суффиксом:..?.

var str = '201412211732-34.20333,-56.23234 value1=pair1;value2=pair2;valueN=pairN'; 
 
var prefix = str.match(/(.{8})(.{4})([^,]+),([^ ]+)/); 
 
var options = {}; 
 

 
if (prefix) { 
 
    var re = /([^=]+)=([^;]+);?/g, 
 
    suffix = str.substring(prefix[0].length), 
 
    item; 
 

 
    while (item = re.exec(suffix)) { 
 
    options[item[1]] = item[2]; 
 
    } 
 
} 
 

 
console.log(prefix, options);