Perl и регулярное выражение для извлечения пути - PullRequest
1 голос
/ 25 июня 2011

У меня есть блок текста / кода, в котором мне нужно найти include =, а затем взять весь путь после '='. Я пробовал несколько способов, и я просто не могу понять, что я ищу в куске кода / текста:

include=Y:\default\main\tsconfig\custom\inline\callouts\search\results.

предположим, что это искомый xml:

<item name="Post Include Code">
<value>
First section of content

include=Y:\default\main\tsconfig\tsconfig\custom\inline\callouts\search\results.tpl
Second section of content
</value>

</item>

Код:

if ($includeText=~ s/include=(.*)$/\1/) { 
    print "$1";
}
else { 
    print "no path";
}

Я хочу получить Y:\default\main\tsconfig\custom\inline\callouts\search\results.tpl, чтобы я мог включить шаблон. Текст / код взят из другого файла.

Спасибо!

Ответы [ 5 ]

2 голосов
/ 25 июня 2011

Я внес небольшое изменение в ваш скрипт и он работает:

$include = "include=Y:\\default\\main\\tsconfig\\custom\\inline\\callouts\\search\\results.";


if ($include =~ m/include=(.*)$/) { 
    print "$1";
}
else { 
    print "no path";
}
1 голос
/ 25 июня 2011

Извините, приятель, я взял твой сценарий, использовал его, и он работает просто отлично. В вашем регулярном выражении нет ничего плохого, скорее в другом коде, который вы не показали.

Также: немного больше информации о вашей проблеме было бы здорово. «Я просто не могу понять ...», на самом деле мало что говорит нам о том, что идет не так.

Мой думаю , что вы не используете:

use strict;
use warnings;

И поэтому вы сделали что-то глупое, например:

while ($includetext = <DATA>) {
    if ($includeText =~ s/...)

Этот скрипт работает:

use warnings;
use strict;

while (<DATA>) {
    if (s/include=(.*)$/$1/) { 
            print "$1";
    }
    else { 
            print "no path";
    }
}

__DATA__
include=Y:\default\main\tsconfig\custom\inline\callouts\search\results.
0 голосов
/ 25 июня 2011

Я думаю, это то, что вы ищете

#!/usr/bin/perl
use strict;
use diagnostics;
my $inc='include=Y:\default\main\tsconfig\custom\inline\callouts\search\results.tpl';
if ($inc =~ m{include=([\w\:\\\w /]+\w+\.\w+)} )
{
print $1;
}
else
{
print "no path";
}
0 голосов
/ 25 июня 2011

// EDIT: исправлено после просмотра нескольких примеров Кажется, это работает, это то же самое, что и пост Рагурама.

if($includeText =~ m/include=(.*)$/){
                    print "$1";
                    }
                    else { 
                        print "no path";
                    }
0 голосов
/ 25 июня 2011

Вы не хотите включать часть «include =». Вы хотите только то, что после, поэтому вам придется исключить часть «include =» с чем-то вроде этого: [^include=].* (быстрый текст в текстовом редакторе сработал для меня).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...