#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 Да, это странное требование. В основном удалите
/
и/@
, но сохраняйте./
Спасибо за вашу помощь. Это удаляет,/@
но не/
. Хах.