[완료] 디렉토리와 파일명으로 분리하는 perl 정규식?

jinserk의 이미지

/aaa/bbb/ccc/ddd/filename.ext

라는 스트링이 있을때, 이를 다음과 같이 분리하고 싶습니다.
$1=/aaa/bbb/ccc/ddd
$2=filename.ext

만일 filename.ext 만 있을 경우는
$1=/.
$2=filename.ext

로 분리하고 싶구요.

정규식을 거의 처음 접하다보니 어떻게 해야 할지 전혀 감이 안잡히네요.
도움 부탁드립니다.

aero의 이미지

path 다루는 것은 운영체제 마다 delimeter도 다르므로 직접 처리하는 건
나중에 다른 플랫폼으로 포팅시 문제가 됩니다. Perl은 이미 이런 경우를 대비하여
스스로 알아서 적절히 path를 처리하는 기능을 가지고 있습니다.

위 같은 문제는 Perl Core Module(기본적으로 Perl과 같이 배포되는 모듈)에 포함된
File::Spec ( http://perldoc.perl.org/File/Spec.html ) 이란 모듈을 사용해서 다음과 같이
할 수 있습니다.

UNIX류

#!/usr/bin/env perl
use strict;
use warnings;
use File::Spec;
 
my $str = '/aaa/bbb/ccc/ddd/filename.ext';
 
my ( $volume, $directory, $file ) = File::Spec->splitpath( $str );
print "$volume | $directory | $file\n";

결과
 | /aaa/bbb/ccc/ddd/ | filename.ext

Windows

#!/usr/bin/env perl
use strict;
use warnings;
use File::Spec;
 
my $str = 'c:\aaa\bbb\ccc\ddd\filename.ext';
 
my ( $volume, $directory, $file ) = File::Spec->splitpath( $str );
print "$volume | $directory | $file\n";

결과
c: | \aaa\bbb\ccc\ddd\ | filename.ext

알아서 잘 처리해주죠? :)

jinserk의 이미지

감사합니다. ^^

실은 boost 의 regex 모듈을 사용해서 정규식을 처리해야 하는데
디폴트가 perl 방식이어서 정규식을 여쭤본 것이었습니다.

안그래도 운영체제마다 다른걸 어떻게 처리해야 하나 하는 문제도 걱정이지만
그냥 '/' '\\' 둘중 하나라 치고 처리할 생각이었습니다.

죄송하지만 정규식으로도 어떻게 표현하면 좋을지 알려주실 수 있으신지요? ^^

Leo.

jinserk의 이미지

감사합니다. 부스트에도 저런 모듈이 있는줄 처음 알았습니다.

근데 문서를 읽어봤지만 적절한 설명이나 예제를 못찾겠네요.
filesystem 에서 경로와 파일명으로 분리하는 함수가 뭘까요? -_-

Leo.

jinserk의 이미지

boost_fs::path cmd(argv[0]);
string cwd;
if (cmd.has_parent_path())
    cwd = cmd.parent_path().string();
else
    cwd = ".";

이렇게 하니까 일단 path 와 파일명 분리가 가능하네요.
도움주신 분들께 감사드립니다.

Leo.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.