需要帮助修改这个正则表达式:^ \ d + \。[\ t] +(。+)[\ t] + by [\ t] +(。+)$

时间:2010-12-22 01:00:29

标签: regex

我正在使用这个正则表达式:

^\d+\.[ \t]+(.+)[ \t]+by[ \t]+(.+)$

在这个字符串上:

1. Gulliver's Travels by Jonathan Swift

并执行此替换:

\2 \1

得到这个结果:

Jonathan Swift Gulliver's Travels

但是,我在我的数据中发现了另一个用例,其中作者没有用by分隔,而是用冒号分隔,顺序颠倒了。相反,它是

<number><period><space><author>:<space><title>
像这样:

1. Jonathan Swift: Gulliver's Travels

如何修改原始正则表达式以获得与以前相同的输出?

3 个答案:

答案 0 :(得分:1)

也许你可以使用以下正则表达式(我想根据你的例子,冒号之前没有空格):

^\d+\.[ \t]+(.+)([ \t]+by|:)[ \t]+(.+)$

这样,如果您在\2中捕获“by”,则可以\3 \1,否则您可以执行\1 \3

修改

这是一个简单的Perl程序,演示了上述内容:

$input = <STDIN>;
chomp($input);

if($input =~ m/^\d+\.[ \t]+(.+)([ \t]+by|:)[ \t]+(.+)$/) {
    if($2 eq ":") {
    print "$1 $3\n";
    }
    else {
    print "$3 $1\n";
    }
}

答案 1 :(得分:0)

您可以尝试类似:^\d+\.\s(.+):\s(.+)\s*$

答案 2 :(得分:0)

我个人认为,你的正则表达式中的by会被非捕获(?:by|\x3A)替换,而且不熟悉被替换的捕获,但是你可以将命名组应用于它(或明确地使一个捕获\ 1和另一个\ 2)?