3

需要将文本文件中每次出现的字符串“gotcha”转换为gotcha[1],gotcha[2]gotcha[3](按顺序)。

我可以用一个简单的 C++ 程序轻松做到这一点,但想知道是否有更简单的方法。我的文本编辑器中的正则表达式替换似乎没有能力。经过一番浏览,看起来 Perl、sed 或 awk 可能是正确的工具,但我对其中任何一个都不熟悉。

4

4 回答 4

1

在红宝石中,

count = 0
"gotcha gotcha gotcha".gsub(/(gotcha)/) {|s| count+=1; s + "[" + count.to_s  +  "] ";}

输出:

 => "gotcha[1]  gotcha[2]  gotcha[3] "

但这是非常红宝石特有的方式。

了解您要使用的语言将有助于获得特定于语言的解决方案。

于 2013-04-27T18:59:56.603 回答
1

我不知道其他语言是否支持这一点,但在 PHP 中你有e修饰符,这当然不好用,并且在最近的 PHP 版本中已被弃用。所以这是PHP中的POC :

$string = 'gotcha wut gotcha wut gotcha wut gotcha PHP gotcha rocks gotcha !!!'; // a string o_o
$i = 0; // declaring a variable i which is 0

echo preg_replace('/gotcha/e', '"$0[".$i++."]"', $string);


/*
   + echo --> output the data
         + preg_replace() --> function to replace with a regex
                + /gotcha/e
                    ^     ^--- The e modifier (eval)
                    --- match "gotcha"

                + "$0[".$i++."]"
                  $0 => is the capturing group 0 which is "gotcha" in this case"
                  $i++ => increment i by one
                  Ofcourse, since this is PHP we have to enclose string
                 between quotes (like any language :p)
                 and concatenate with a point:  "$0["   .   $i++   .   "]"

                + $string should I explain ?
*/

在线演示


当然,因为我知道有一些反对者,所以我将向您展示在没有e修饰符的情况下在 PHP 中执行此操作的正确方法,让我们preg_replace_callback

$string = 'gotcha wut gotcha wut gotcha wut gotcha PHP gotcha rocks gotcha !!!';
$i = 0;
// This requires PHP 5.3+
echo preg_replace_callback('/gotcha/', function($m) use(&$i){
    return $m[0].'['.$i++.']';
}, $string);

在线演示

于 2013-04-27T19:27:29.797 回答
1

在python中它可能是:

import re

a = "gotcha x gotcha y gotcha z"

g = re.finditer("gotcha", a)

for i, m in reversed(list(enumerate(g))):
    k = m.end()
    a = '{}[{}]{}'.format(a[:k], i, a[k:])

print a

当然,您可以将它们全部塞进一行(出于节省垂直空间的更高目的)

于 2013-04-27T19:29:12.470 回答
1

在 Perl 中:

$a = "gotcha x gotcha y gotcha z";

$i = -1; $a =~ s/(gotcha)/$i+=1;"gotcha[$i]"/ge;

print "$a\n";
于 2013-04-27T20:23:43.383 回答