2015-04-17 2 views
2

Учитывая этот текст:JS: соответствующие записи с группами захвата, учета новых линий

1/12/2011 
I did something. 

10/5/2013 
I did something else. 

Here is another line. 

And another. 

5/17/2014 
Lalala. 
More text on another line. 

Я хотел бы использовать регулярное выражение, чтобы получить это (или, возможно, некоторые другие средства?):

["1/12/2011", "I did something.", "10/5/2013", "I did something else.\n\nHere is another line.\n\nAnd another.", "5/17/2014", "Lalala.\nMore text on another line."] 

дата часть и содержание часть каждый отдельный запись, чередующийся.

Я попытался использовать [^] вместо точки, поскольку JS. * Не соответствует новым строкам (как говорит Matching multiline Patterns), но тогда совпадение является жадным и занимает слишком много, поэтому в результирующем массиве только 1 запись:

var split_pattern = /\b(\d\d?\/\d\d?\/\d\d\d\d)\n([^]+)/gm; 
var array_of_mems = contents.match(split_pattern); 

// => ["1/12/2011↵I did something else..."] 

Если добавить знак вопроса, чтобы получить [^] + ?, которая согласно How to make Regular expression into non-greedy? делает матч не жадный, то я получаю только первый символ части контента.

Какой лучший метод? Заранее спасибо.

ответ

1

Вы можете использовать метод exec() в цикле, чтобы получить желаемые результаты.

var re = /^([\d/]+)\s*((?:(?!\s*^[\d/]+)[\S\s])+)/gm, 
matches = []; 

while (m = re.exec(str)) { 
    matches.push(m[1]); 
    matches.push(m[2]); 
} 

Выход

[ '1/12/2011', 
    'I did something.', 
    '10/5/2013', 
    'I did something else.\n\nHere is another line.\n\nAnd another.', 
    '5/17/2014', 
    'Lalala.\nMore text on another line.' ] 

eval.in

+0

Могу ли я получить некоторое пояснение к регулярному выражению - как работает [\ d /] +? И, похоже, ключевая идея - использовать [\ S \ s] ... что это такое? Или просто ключевые моменты в регулярном выражении в целом, так как я хотел бы понять это, а не просто просто копировать его. Я посмотрю на?: И?! Я не думаю, что это не захватывающий grouop & negative lookahead ... это ключевые идеи, которые я не рассматривал при попытке написать собственное регулярное выражение. Благодаря! – dmonopoly

+0

@ dmonopoly, посмотрите http://www.rexegg.com/regex-disambiguation.html – hwnd

2
(\d{1,2}\/\d{1,2}\/\d{4})\n|((?:(?!\n*\d{1,2}\/\d{1,2}\/\d{4})[\s\S])+) 

Вы можете попробовать это. Захватить захваты. Смотрите демоверсию.

https://regex101.com/r/sJ9gM7/126

var re = /(\d{1,2}\/\d{1,2}\/\d{4})\n|((?:(?!\n*\d{1,2}\/\d{1,2}\/\d{4})[\s\S])+)/gim; 
var str = '1/12/2011\nI did something.\n\n10/5/2013\nI did something else.\n\nHere is another line.\n\nAnd another.\n\n5/17/2014\nLalala.\nMore text on another line.'; 
var m; 

if ((m = re.exec(str)) !== null) { 
if (m.index === re.lastIndex) { 
re.lastIndex++; 
} 
// View your result using the m-variable. 
// eg m[0] etc. 
} 
+0

Спасибо за большой ответ! Используется ли «?:» К «(?! \ N * \ d {1,2} \/\ d {1,2} \/\ d {4})" или применяется ли оно к "((?! \ n * \ d {1,2} \/\ d {1,2} \/\ d {4}) [\ s \ S]) + "? Синтаксис говорит мне последний, но тогда я не понимаю, как подобный контент, как «я сделал что-то», подбирается, потому что «?:» Означает не фиксировать совпадение. – dmonopoly

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