0

Я пытаюсь пропустить первую точку с запятой в строке и сделать разделение на остальной часть точки с запятой, используя регулярное выражение:Пропустить первое появление точки с запятой, используя регулярное выражение

lines = </li> <li> Urinary tract infection </li> <li> Respiratory infection </li> <li> Sinus problems; and </li> <li> Ear infections; <li> Some more info </li> 

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

lines.split(/(?<!\\\\);/) 

Мой ожидаемый результат:

["</li> <li> Urinary tract infection </li> <li> Respiratory infection </li> <li> Sinus problems; and </li> <li> Ear infections","<li> Some more info </li>" ] 

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

+0

См [это демо] (HTTP: // ideone. com/D4Chmm) - здесь, однако, он разделен на последнюю полуколону. –

+0

@ WiktorStribiżew Спасибо за быстрый ответ. Строка, которую я опубликовал, является всего лишь примером. Исходная строка, в которой работает im, слишком длинна и имеет несколько точек с запятой. Так что я хочу, чтобы только первая половина двоеточия пропустила и оставила все полуколоны рассмотрены. Я только что обновил вопрос – Raghu

+0

. Что относительно [этой демонстрации] (http://ideone.com/I7rB7B)? 'Lines.scan (/ \ A [^;] * [^;] * | [^;] + /)'? –

ответ

0

Должен ли я использовать регулярное выражение?

str = "Now is; the time; for all good; people; to party" 

f, sc, l = str.partition(';') 
af, *a = str[str.index(';')+1..-1].split(';') 
[f+sc+af, *a] 
    #=> ["Now is; the time", " for all good", " people", " to party"] 

шаги:

f, sc, l = str.partition(';') 
    #=> ["Now is", ";", " the time; for all good; people; to party"] 
f #=> "Now is" 
sC#=> ";" 
l #=> " the time; for all good; people; to party" 
idx = str.index(';')+1 
    #=> 7 
b = str[idx..-1] 
    #=> " the time; for all good; people; to party" 
af, *a = b.split(';') 
af #=> " the time" 
a #=> [" for all good", " people", " to party"] 
[f+sc+af, *a] 
    #=> ["Now is; the time", " for all good", " people", " to party"] 

Например Ор по:

f, sc, l = lines.partition(';') 
af, *a = lines[lines.index(';')+1..-1].split(';') 
[f+sc+af, *a] 
    #=> ["</li> <li> Urinary tract infection </li> <li> Respiratory infection\  
     </li> <li> Sinus problems; and </li> <li> Ear infections", 
    # " <li> Some more info </li>"] 

Другой способ:

b = str.sub(';', 0.chr).split(';') 
    #=> ["Now is\u0000 the time", " for all good", " people", " to party"] 
a[0].sub!(0.chr, ';') 
    #=> "Now is; the time" 
a #=> ["Now is; the time", " for all good", " people", " to party"] 
+0

Означает ли это, что вы предполагаете, что в результате будет определенное количество элементов? –

+0

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

+0

Ну, я просто против кода только ответы. Некоторые комментарии к коду будут очень полезны. –

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