Доставать контент колонн (специфическая часть) в тексте, отделенном точкой с запятой с RegEx

У меня есть текст нечто похожее:

42441;27;nombre;apellidos;direccion; 8-2º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
                          ^^^^^^^^^^^^^^^

Вот что я пробую достать, то, что снова отмечено (direccion; 8-2º) с регулярным выражением, чтобы после мочь унифицировать это и использовать как единственный текст и помещать внутри положения array.

Вы можете бросать мне руку?

1
задан 17.01.2017, 08:46
1 ответ

Чтобы извлекать 5-ое и 6-ое поле ты был бы должен делать:

^(?:[^;]*;){4}([^;]*;[^;]*);

Отпусти первые 4 поля, отделенных из-за ';' и возьми двух следующих.

Если то, что ты хочешь, он состоит в том, чтобы заменять ; адреса из-за , в C#, что ты можешь делать, состоит в том, чтобы помещать весь контент цепи в группы задержания так что ты можешь использовать их в цепи замены: группа была бы всем предыдущим в ';' который ты хочешь заменить, другой ';' чтобы заменять, и другой текст далее.

Смотри этот пример с несколькими линиями:

string reemplazo =
    @"42441;27;nombre;apellidos;direccion1; 8-2º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion2, 9-3º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion3; 10-4º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion4, 11-5º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion5; 12-6º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion6, 13-7º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion7; 14-8º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion8; 15-9º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11";

reemplazo = Regex.Replace(reemplazo, "^((?:[^;]*;){4}[^;]*)(;)((?:[^;]*;){27}[^;]*)$", "$1,$3", RegexOptions.Multiline);
Console.Write(reemplazo);

Console.ReadKey();

Если может быть более одного символа ';' в адресе, он осложнился бы немного больше:

string reemplazo =
    @"42441;27;nombre;apellidos;direccion1; 8-2º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion2, 9-3º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion3; 10-4ºB; 2ºA; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion4, 11-5º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion5; 12-6º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion6, 13-7º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion7; 14-8º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11
    42441;27;nombre;apellidos;direccion8; 15-9º; SEVILLA;SEVILLA;12345;texto;123456789;;test@gmail.com;123456;;1900-08-20;1904-06-30 00:00:00;0000-00-00 00:00:00;2;1;0000-00-00;0000;1111;1111;11;0123456789;;18;0;0;2;15;ES11";

MatchCollection matches = Regex.Matches(reemplazo, "^((?:[^;]*;){4})(.*)((?:;[^;]*){27})$", RegexOptions.Multiline);

var lines = matches.Cast<Match>()
    .Select(m => $"{m.Groups[1].Value}{m.Groups[2].Value.Replace(";", ",")}{m.Groups[3].Value}");
reemplazo = string.Join("\r\n", lines);

Console.Write(reemplazo);

Console.ReadKey();

То, что он не мог бы перемещать в этом случае, состоит в том, чтобы не было полей. Если может быть изменчивое число символов ';' в адресе число полей каждой линии должно быть тем же самым. Если не, нет способа знать, где он начинается и где он заканчивает адрес.

1
ответ дан 24.11.2019, 14:15
  • 1
    Ответ хороший, но он нуждался бы в том, чтобы проигнорировать первые 4 поля, и что только получил часть в полужирном шрифте. (Выражение - м и # 225; s осложненная, которого он ждал: D) – Vitaly 01.06.2016, 12:14
  • 2
    #191; И он возвращает тебе другую вещь? Пытаясь с текстом, который ты поместил в м и # 237; он возвращает меня " адрес; 8-2 и # 186; ". и #191; это не это, что ты ищешь? – Asier Villanueva 01.06.2016, 12:16
  • 3
    S и # 237; но он возвращает меня мне " 42441; 27; имя; фамилии; адрес; 8-2 и # 186;; " когда я жду только " адрес; 8-2 и # 186;; " – Vitaly 01.06.2016, 12:19
  • 4
    #191; В qu и # 233; est и # 225; s программируя? В зависимости от языка смогли быть изменения, хотя не быть должным и # 237; в в такой простой одной. Ты можешь подтверждать результат expresi и # 243; n в: regex101.com/r/oN2vV0/1 – Asier Villanueva 01.06.2016, 12:24
  • 5
    Он в C # и я использую следующее, чтобы пробовать унифицировать " адрес; 8-2 и # 186; " в " адрес, 8-2 и # 186; ": Матч матч = Regex. Матч (remplazo, " ^ (?: [^;] *;) {4} ([^;] *; [^;] *); " RegexOptions. Singleline); if (матч. Success & & матч. Groups. Count > 3) {remplazo = remplazo. Повторно нравься (матч. Groups [0].Value, матч. Groups [1].Value + " " + матч. Groups [3].Value);} Схвати и # 237; в переменной " remplazo" он у меня должен оставаться унифицированным. – Vitaly 01.06.2016, 12:27

Теги

Похожие вопросы