【问题标题】:Regular expression matching a number of characters which amount had been parsed before正则表达式匹配之前已解析的数量的字符
【发布时间】:2011-05-20 09:23:13
【问题描述】:

假设我有一个文件,其中包含如下所示的行:

"7sunrIsEfoo"
"10ecological09"
"3bedtime"

每一行都以代表数字 n 的数字开头。我想匹配它后面的 n 个字符。输出应该是:

sunrIsE
ecological
bed

有没有办法使用正则表达式来做到这一点?我的第一次尝试是:

([0-9]*)[a-zA-Z]{\1}

但它似乎不起作用。

【问题讨论】:

    标签: regex character digits


    【解决方案1】:

    使用正则表达式是不可能的。

    ([0-9]*) 只是将数字“记住”为子字符串:它们不能以数字形式使用。

    【讨论】:

    • 我很惊讶{} 甚至没有尝试转换为 int 并多次匹配。
    【解决方案2】:

    在 Ruby 中,您可以使用:

    result = string[/(\d+)([a-zA-Z]+)/,2][0,$1.to_i]

    它会给你预期的结果。

    【讨论】:

    • 我确信 Perl 也有办法通过混合简单的编程逻辑来做到这一点。请注意,它不再是正则表达式(以防 OP 不知道它)
    • 完全同意你的看法。这是对前面两个关于如何实现它的答案的补充。
    【解决方案3】:

    正则表达式不太适合此任务。他们没有建立解释数字的方法。 您可以通过使用来使用(混乱的)解决方法

    (?<=1).|(?<=2)..|(?<=3)...| 
    

    以此类推(虽然你最好使用相反的顺序,否则到11时你会遇到问题)。请注意,除非您真的没有其他方法,否则您不应该使用此方法=)

    【讨论】:

    • 这就像回答一个问如何用茶匙挖奥林匹克游泳池的人:)
    • @Bart:呵呵,我同意。当我看到这些问题时,我通常会觉得用正则表达式做一些愚蠢的事情是一种挑战。当我找到解决方案时,我不妨发布它。 OP 可能处于一些非常模糊的情况,除了正则表达式,他真的不能使用任何东西。你可以用茶匙挖游泳池。你只是不想。 =)
    【解决方案4】:

    这是在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      相关资源
      最近更新 更多