0

我无法创建一个只返回部分字符串的正则表达式。

传递以下字符串:

/path/of/the/file/1 - 2 - Lecture 1.2_ Max Bense (13_49).mp4
/path/of/the/file/1 - 3 - Lecture 1.3_ Michael Friedman (12_15).mp4
/path/of/the/file/2 - 1 - Lecture 2.1_ Paul Feyerabend (12_55).mp4
/path/of/the/file/2 - 2 - Lecture 2.2_ Alhazen (11_37).mp4
/path/of/the/file/3 - 2 - Lecture 3.2_ Study Case - Dominicus Gundissalinus (14_30).mp4 
/path/of/the/file/3 - 3 - Lecture 3.3_ Study Case - Carl Friedrich von Weizsacker (11_48).mp4

它应该分别只返回以下部分:

Max Bense
Michael Friedman
Paul Feyerabend
Alhazen
Study Case - Dominicus Gundissalinus
Study Case - Carl Friedrich von Weizsacker
4

3 回答 3

0

这似乎是一项轻松的工作awk_它使用 chars或分割字段中的行(,因此名称将是第二个,然后删除该字段的前导和尾随空格:

awk '
    BEGIN { 
        FS = "[_(]" ;
    } 
    { 
        gsub( /^ *| *$/, "", $2 ); 
        print $2 ;
    }
' infile

输出:

Max Bense
Michael Friedman
Paul Feyerabend
Alhazen
Study Case - Dominicus Gundissalinus
Study Case - Carl Friedrich von Weizsacker
于 2012-07-18T22:25:23.987 回答
0

使用 PCRE 和 Positive Lookbehind

如果您可以访问支持 PCRE 表达式的正则表达式引擎,则可以使用正向查找从 MP3 列表中获取您想要的文本。例如:

pcregrep -o '(?<=_ )([^(]+)' /tmp/foo

使用 Sed

如果您没有与 Perl 兼容的 grep,则可以使用 sed 代替。它的可读性要低得多,但便携性要高得多。例如:

sed 's/.*_ \([^(]\+\).*/\1/' /tmp/foo
于 2012-07-18T22:26:31.007 回答
0

这是一个 JavaScript 解决方案:

var files=["/path/of/the/file/1 - 2 - Lecture 1.2_ Max Bense (13_49).mp4",
"/path/of/the/file/1 - 3 - Lecture 1.3_ Michael Friedman (12_15).mp4",
"/path/of/the/file/2 - 1 - Lecture 2.1_ Paul Feyerabend (12_55).mp4",
"/path/of/the/file/2 - 2 - Lecture 2.2_ Alhazen (11_37).mp4",
"/path/of/the/file/3 - 2 - Lecture 3.2_ Study Case - Dominicus Gundissalinus (14_30).mp4",
"/path/of/the/file/3 - 3 - Lecture 3.3_ Study Case - Carl Friedrich von Weizsacker (11_48).mp4​​​​"];
var regex=/_\s(.+)\s/;

​for (var i = 0; i < files.length; i++) {
    console.log(regex.exec(files[i])[1]);
}​

http://jsfiddle.net/g8zPv/

于 2012-07-18T22:27:59.897 回答