Regex получить столбец - PullRequest
       108

Regex получить столбец

1 голос
/ 03 мая 2020

Учитывая следующую ; строку с разделителями:


a;; z
toy;d;hh 
z;
d;23
;;io;
b y;b;12

a;b;bb;;;34

Я ищу получить 3-й столбец, если он существует, любой строки, чей 1-й столбец не d, b y или toy.

Итак, желаемый результат будет


 z

io

bb

У меня пока есть это регулярное выражение:

^(?!(d|b y|toy);([^;\r\n]*);([^;\r\n]*)).*\R

, как показано в этой демонстрации

На мой взгляд, есть как минимум 2 проблемы:

5-я строка, содержащая d в первом столбце, совпадает и не должна

матчи не возвращаются группировки

Любая помощь будет оценена

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Я думаю, вы можете использовать

^(?:([^\r\n;]*)(?:;(?!(?:23|b)(?=;|$))([^\r\n;]*)(?:;([^\r\n;]*))?.*)?|.*)$

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

  • ^ - начало строки
  • (?:([^\r\n;]*)(?:;(?!(?:23|b)(?=;|$))([^\r\n;]*)(?:;([^\r\n;]*))?.*)?|.*) - группа без захвата:
    • ([^\r\n;]*)(?:;(?!(?:23|b)(?=;|$))([^\r\n;]+)(?:;([^\r\n;]*))?.*)? -
      • ([^\r\n;]*) - Группа 1: 0+ символов, кроме LF, CR и ;
      • (?:;(?!(?:23|b)(?=;|$))([^\r\n;]+)(?:;([^\r\n;]*))?.*)? - необязательная группа без захвата:
      • ; - точка с запятой
      • (?!(?:23|b)(?=;|$))([^\r\n;]*) - 0 или более символов, кроме CR, LF и ; , но не равно 23 или b
      • (?:;([^\r\n;]*))? - необязательная группа без захвата, совпадающая с ; с последующим захватом в группы X + 0 кроме LF, CR и ;
      • .* - любые 0+ символов, кроме символов разрыва строки, максимально возможное количество
    • | - или
    • .* - любые 0+ символов, кроме символов разрыва строки, как можно больше
  • $ - конец строки.
1 голос
/ 03 мая 2020

Вы можете использовать это регулярное выражение для соответствия желаемым значениям в третьем столбце:

^(?!d|b y|toy)(?:[^;\n]*;){2}([^;\n]+)

Он утверждает, что строка начинается не с d, b y или toy, затем пропускает два значения столбца и захватывает третий столбец в группе 1. Добавив .* в конец этого регулярного выражения и затем чередование ^.*$ в регулярное выражение, мы можем отбросить все, что не соответствует первому регулярному выражению, просто замена на $1:

^(?!d|b y|toy)(?:[^;\n]*;){2}([^;\n]+).*$|^.*$

Демонстрация на regex101

...