Разделить уникальную косую черту

#regex #perl

#регулярное выражение #perl

Вопрос:

  ./dms:element[@name="obj_id"]/dms:qualifier[@name="object_status"]/@value[obj_id_status]
  

Попытка разделить строку так, чтобы результат выглядел как

 ./dms:element[@name="obj_id"]
dms:qualifier[@name="object_status"]
value[obj_id_status]
  

Есть ли способ сделать это с помощью регулярного выражения? Я хочу разделить, когда / один, но не разделять ./ , а также удалять /@ .

Комментарии:

1. Это похоже на xpath. Вы пытаетесь вручную обрабатывать запросы xpath? (Если да, то зачем относиться ./ по-другому?)

2. perl -ne 'my @sections = split ///, $_; foreach (@sections) { s/^@//; print $_; print "/" if m/^.|.$/; print "n" unless m/^.|.$/; }' your_input_file выводит желаемый результат. Извините за быстрый код. Это было сделано… быстро

3. @yonyon100: Это также разбивается на косые черты, перед которыми стоит точка.

Ответ №1:

 use v5.10;

my $s = './dms:element[@name="obj_id"]/dms:qualifier[@name="object_status"]/@value[obj_id_status]';

my @parts = split qr|(?<!.)/@?|, $s;

say for @parts;
  

вывод

 ./dms:element[@name="obj_id"]
dms:qualifier[@name="object_status"]
value[obj_id_status]
  

Комментарии:

1. Мой ответ все еще остается в силе

2. Это не приведет к удалению /@

3. Просто выскажите это позже. Простая замена. $parts[-1] =~ s{^/@}{} или с map , если это может быть в любой позиции.

4. Извините, я пропустил это. Итак, вы хотите разделить на косые черты, которым не предшествует точка, и удалить первые два символа, если за косой чертой следует @ ? Это странное требование. Попробуйте мою модификацию.

5. @Borodin Да, это странное требование. В основном удалите / и /@ , но сохраняйте ./ Спасибо за вашу помощь. Это удаляет, /@ но не / . Хах.