我正在使用这个正则表达式:
^\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
如何修改原始正则表达式以获得与以前相同的输出?
答案 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)?