2015-05-10 2 views
4

У меня есть несколько строк, из которых я хочу извлечь подстроку. Вот пример:perl регулярное выражение match substring

/skukke/integration/build/IO/something 

Я хотел бы, чтобы извлечь все после 3-го / характера. В этом случае выходной сигнал должен быть

/build/IO/something 

Я пытался что-то вроде этого

/\/\s*([^\\]*)\s*$/ 

Результат этого матча

something 

Который не то, что я хочу. Может ли кто-нибудь помочь?

+3

Похоже на то, что вы действительно хотите сделать, это создать пути к файлам относительно '/ skukke/integration'. Вам следует избегать сопоставления шаблонов и использовать модуль ['File :: Spec :: Functions'] (https://metacpan.org/pod/File::Spec::Functions) и функцию' abs2rel'. Но вам нужно лучше объяснить, что вам нужно, прежде чем кто-нибудь сможет написать решение. – Borodin

ответ

2

Regex Решение

Регулярное выражение вы можете использовать это:

(?:\/[^\/]+){2}(.*) 

См demo

Regex объяснение:

  • (?:\/[^\/]+){2} - Матч ровно в 2 раза / и все, что не / 1 или несколько раз
  • (.*) - Совпадение 0 или более символов после того, что мы соответствуют до и положить в группу захвата 1.

Вот демо на TutorialsPoint:

$str = "/skukke/integration/build/IO/something"; 
print $str =~ /(?:\/[^\/]+){2}(.*)/; 

Выход:

/build/IO/something 

Non-регулярное выражение решение

Вы можете использовать File::Spec::Functions:

#!/usr/bin/perl 
use File::Spec; 
$parentPath = "/skukke/integration"; 
$filePath = "/skukke/integration/build/IO/something"; 
my $relativePath = File::Spec->abs2rel ($filePath, $parentPath); 
print "/". $relativePath; 

Выходы /build/IO/something.

См demo on Ideone

+1

@Downvoter: https://goo.gl/YX5KQr для вас. Рабочие решения Downvoting BAD. –

+0

Работает как шарм! спасибо большое :) –

+0

Рад помочь. Пожалуйста, подумайте о принятии ответа. –

0

Использовать этот Regex:

my $string = "/skukke/integration/build/IO/something"; 
$string =~ s/\/[a-zA-Z0-9]*\/[a-zA-Z0-9]*//; 

Надежда Это помогает.

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