2012-04-10 6 views
0

Как я могу получить от этой строкиРазбираем сложную строку с одним регулярным выражением

genre:+Drama,Comedy+cast:+Leonardo+DiCaprio,Cmelo+Hotentot+year:+1986-1990 

это

genre: [Drama, Comedy], 
cast: [Leonardo DiCaprio, Cmelo Hotentot], 
year: [1986-1990] 

с одним регулярным выражением?

+5

Почему это _have_ должно быть только одним регулярным выражением? – Oded

+1

вы не можете, в общем, потому, что есть два уровня группировки для результатов (тема и запись), а регулярные выражения поддерживают только один уровень. –

+0

Я надеялся на элегантное одно регулярное выражение :) Мне было просто любопытно, можно ли это сделать – acheruns

ответ

1

Это может быть сделано с использованием одного регулярного выражения и перегрузки функции replace с заменой в качестве второго аргумента. Но если честно, я должен использовать еще один replace, чтобы избавиться от плюсов (+) - я заменил их пробелом () символ:

var str = 'genre:+Drama,Comedy+cast:+Leonardo+DiCaprio,Cmelo+Hotentot+year:+1986-1990'; 
str = str.replace(/\+/g, ' '); 
var result = str.replace(/(\w+:)(\s?)([\w,\s-]+?)(\s?)(?=\w+:|$)/g, function (m, m1, m2, m3, m4, o) { 
    return m1 + ' [' + m3.split(',').join(', ') + ']' + (o + m.length != str.length ? ',' : '') + '\n'; 
}); 

Вы можете найти полный пример на jsfiddle.

1

Вы не получите их в массивы с самого начала, но его можно разобрать, если заказ остается неизменным все время.

var str = "genre:+Drama,Comedy+cast:+Leonardo+DiCaprio,Cmelo+Hotentot+year:+1986-1990"; 
str = str.replace(/\+/g," "); 

//Get first groupings 
var re = /genre:\s?(.+)\scast:\s?(.+)\syear:\s(.+)/ 
var parts = str.match(re) 

//split to get them into an array 
var genre = parts[1].split(","); 
var cast = parts[2].split(","); 
var years = parts[3]; 

console.log(genre); 
+0

К сожалению, заказ не будет оставаться неизменным все время. На самом деле это всегда будет отличаться – acheruns

+0

Чем вам нужно это делать по частям! – epascarello

0

Вы не можете сделать это, используя только регулярные выражения, потому что вы пытаетесь разобрать (крошечную) грамматику.

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