Regex: найти помеченные строки в тексте - PullRequest
1 голос
/ 21 января 2020

Я получил следующую строку запроса, которая содержит пару теговых значений (key: value пар) всегда в конце строки:

Lorem ipsum age:85 date:15.05.2015 sender: user: John Doe

"Lorem ipsum" - это строка, которую следует игнорировать как это не пара. Допустимы следующие пары:

  • age с 85
  • date с 15.05.2015
  • user с John Doe

Тег следует игнорировать, если после двоеточия не найдено содержимого. Их содержимое может также включать пробелы до ключа следующего тега.

Вот что я получил до сих пор:

/([\w-]+):\s*(.+?)(?!\s+[\w-]+:)?/g

, но по какой-то причине оно кажется только первым символом значения а также вставьте тег "user" ( regexr площадка ):

age:8
date:1
sender: u
ser:J

Любая помощь будет высоко ценится!

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Вы можете использовать

(\w[\w-]*):(?!\s+\w[\w-]*:|\s*$)\s*(.*?)(?=\s+\w[\w-]*:|$)

См. Демоверсию regex

Подробности

  • (\w[\w-]*) - Захват группы 1: слово char, за которым следуют 0+ слово или дефис букв
  • : - двоеточие
  • (?!\s+\w[\w-]*:|\s*$) - отрицательный прогноз не сработает, если сразу справа текущего местоположения, есть 1+ пробелов, слово char с последующим 0+ словом или дефисом символов и затем : или 0+ пробелов в конце строки
  • \s* - 0+ пробелов
  • (.*?) - Группа 2: любой ноль или более символов, кроме символов разрыва строки, как можно меньше, вплоть до ближайших ...
  • (?=\s+\w[\w-]*:|$) - 1+ пробелов, слово char, за которым следует 0+ слово или дефис, а затем : или только конец строки.
1 голос
/ 21 января 2020

Я, кажется, получаю хороший пробег по следующей схеме:

(?<!\S)\S+:\s*\S*[^:\s](?!\S)

Демо

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

(?<!\S)   assert that what precedes the start of the key is either whitespace
          or the start of the string
\S+       match one or more non whitespace characters (the key)
:         followed by :
\s*       followed by optional whitespace
\S*       a value, zero or more non whitespace characters
[^:\s]    ending in a non colon
(?!\S)    assert that what follows is either whitespace or the end of the string
...