【发布时间】:2011-05-20 09:23:13
【问题描述】:
假设我有一个文件,其中包含如下所示的行:
"7sunrIsEfoo"
"10ecological09"
"3bedtime"
每一行都以代表数字 n 的数字开头。我想匹配它后面的 n 个字符。输出应该是:
sunrIsE
ecological
bed
有没有办法使用正则表达式来做到这一点?我的第一次尝试是:
([0-9]*)[a-zA-Z]{\1}
但它似乎不起作用。
【问题讨论】:
假设我有一个文件,其中包含如下所示的行:
"7sunrIsEfoo"
"10ecological09"
"3bedtime"
每一行都以代表数字 n 的数字开头。我想匹配它后面的 n 个字符。输出应该是:
sunrIsE
ecological
bed
有没有办法使用正则表达式来做到这一点?我的第一次尝试是:
([0-9]*)[a-zA-Z]{\1}
但它似乎不起作用。
【问题讨论】:
使用正则表达式是不可能的。
([0-9]*) 只是将数字“记住”为子字符串:它们不能以数字形式使用。
【讨论】:
{} 甚至没有尝试转换为 int 并多次匹配。
在 Ruby 中,您可以使用:
result = string[/(\d+)([a-zA-Z]+)/,2][0,$1.to_i]
它会给你预期的结果。
【讨论】:
正则表达式不太适合此任务。他们没有建立解释数字的方法。 您可以通过使用来使用(混乱的)解决方法
(?<=1).|(?<=2)..|(?<=3)...|
以此类推(虽然你最好使用相反的顺序,否则到11时你会遇到问题)。请注意,除非您真的没有其他方法,否则您不应该使用此方法=)
【讨论】:
这是在 Perl 中执行此操作的一种方法:
#!/usr/local/bin/perl
use strict;
use warnings;
my @list = ("7sunrIsEfoo", "10ecological09", "3bedtime");
foreach(@list) {
s/^(\d+)(.+)$/substr($2, 0, $1)/e;
print $_,"\n";
}
输出:
sunrIsE
ecological
bed
【讨论】: