C# 正则表达式-增量替换

C# 正则表达式-增量替换,c#,java,php,python,regex,C#,Java,Php,Python,Regex,有没有办法只使用正则表达式进行整数增量替换 问题是,我有一个文本文件,包含1000000行,所有行都以% 我想用正则表达式递增地将#替换为整数 input: % line one % line two % line three ... output: 1 line one 2 line two 3 line three ... 根据您对语言的选择(您已经列出了一些),PHP可能是一个合适的函数 $text = "% First Line\n% Second Line\n% T

有没有办法只使用正则表达式进行整数增量替换

问题是,我有一个文本文件,包含1000000行,所有行都以%

我想用正则表达式递增地将#替换为整数

input:

% line one

% line two

% line three

...

output:

1 line one

2 line two

3 line three

...

根据您对语言的选择(您已经列出了一些),PHP可能是一个合适的函数

$text = "% First Line\n% Second Line\n% Third Line";

function cb_numbers($matches)
{
    static $c = 1;

    return $c++;
}
$text = preg_replace_callback(
            "/(%)/",
            "cb_numbers",
            $text);

echo $text;

根据您对语言的选择(您已经列出了一些),PHP可能是一个合适的函数

$text = "% First Line\n% Second Line\n% Third Line";

function cb_numbers($matches)
{
    static $c = 1;

    return $c++;
}
$text = preg_replace_callback(
            "/(%)/",
            "cb_numbers",
            $text);

echo $text;

在python re.sub accept函数作为参数中,请参见

在python re.sub accept函数作为参数中,请参见

import re
from itertools import count
s="""
% line one
% line two
% line three"""

def f():
    n=count(1)
    def inner(m):
        return str(next(n))
    return inner

new_s = re.sub("%",f(),s)
或者,您可以在其中使用lambda函数,如下所示:

new_s = re.sub("%",lambda m,n=count(1):str(next(n)),s)
但是完全跳过regexp很容易,也更好

from __future__ import print_function   # For Python<3
import fileinput

f=fileinput.FileInput("file.txt", inplace=1)
for i,line in enumerate(f):
    print ("{0}{1}".format(i, line[1:]), end="")

from uuu future uuuu导入print_函数#For Python这里有一种在Python中实现的方法

import re
from itertools import count
s="""
% line one
% line two
% line three"""

def f():
    n=count(1)
    def inner(m):
        return str(next(n))
    return inner

new_s = re.sub("%",f(),s)
或者,您可以在其中使用lambda函数,如下所示:

new_s = re.sub("%",lambda m,n=count(1):str(next(n)),s)
但是完全跳过regexp很容易,也更好

from __future__ import print_function   # For Python<3
import fileinput

f=fileinput.FileInput("file.txt", inplace=1)
for i,line in enumerate(f):
    print ("{0}{1}".format(i, line[1:]), end="")

Python的uuu future uuuu导入print_函数的

$input = @fopen('input.txt', 'r');
$output = @fopen("output.txt", "w");

if ($input && $output) {
    $i = 0;
    while (!feof($input)) {
        $line = fgets($input);
        fputs($output, ($line[0] === '%') ?
            substr_replace($line, ++$i, 0, 1) :
            $line
        );
    }
    fclose($input);
    fclose($output);
}
仅仅因为您可以,perl一行程序(是的,带有正则表达式):


还有一个PHP版本,可以很好地衡量:

$input = @fopen('input.txt', 'r');
$output = @fopen("output.txt", "w");

if ($input && $output) {
    $i = 0;
    while (!feof($input)) {
        $line = fgets($input);
        fputs($output, ($line[0] === '%') ?
            substr_replace($line, ++$i, 0, 1) :
            $line
        );
    }
    fclose($input);
    fclose($output);
}
仅仅因为您可以,perl一行程序(是的,带有正则表达式):


虽然最好通过逐行读取文件并使用简单的字符串函数检查第一个字符来解决此问题,但以下是如何在java中对字符串进行增量替换:

Pattern p = Pattern.compile("^%");
Matcher m = p.matcher(text);
StringBuffer sb = new StringBuffer();
int i = 0;
while (m.find()) {
    m.appendReplacement(sb, String.valueOf(i++));
}
m.appendTail(sb);

return sb.toString();

虽然最好通过逐行读取文件并使用简单的字符串函数检查第一个字符来解决此问题,但以下是如何在java中对字符串进行增量替换:

Pattern p = Pattern.compile("^%");
Matcher m = p.matcher(text);
StringBuffer sb = new StringBuffer();
int i = 0;
while (m.find()) {
    m.appendReplacement(sb, String.valueOf(i++));
}
m.appendTail(sb);

return sb.toString();
这是一个C#(3.0+)版本:

输出:

1 line one
2 line two
3 line three
当然,它需要将整个文本加载到内存中。如果我真的这么做,我可能会采用逐行的方法。

这里是一个C#(3.0+)版本:

import re, itertools
counter= itertools.count(1)
replacer= lambda match: "%d" % counter.next()
text= re.sub("(?m)^%", replacer, text)
输出:

1 line one
2 line two
3 line three
当然,它需要将整个文本加载到内存中。如果我真的这么做,我可能会采用逐行的方法

import re, itertools
counter= itertools.count(1)
replacer= lambda match: "%d" % counter.next()
text= re.sub("(?m)^%", replacer, text)
计数器
是…一个计数器:)
replacer
是一个以字符串形式返回计数器值的函数。
“(?m^%”
正则表达式适用于行开头的每个
%
(请注意多行标志)


计数器
是…一个计数器:)
replacer
是一个以字符串形式返回计数器值的函数。
“(?m^%”
正则表达式适用于每行开头的
%
(请注意多行标志)。

为什么只使用正则表达式?为什么人们总是认为,一个好的正则表达式可以解决任何问题?对我来说,他们是丑陋的地狱,我希望,我从来没有保持一个。。。看看这个:-这是黑色艺术。不-正则表达式不会“全部替换”,因此甚至不是递增的replacements@Imre:嗯-你是绝对的。“regex不会“全部替换”?”?那是错误的。此外,通过一个helper函数,它可以进行增量替换。例如,检查我的答案。为什么你只想用正则表达式呢?为什么人们总是认为,一个好的正则表达式可以解决任何问题?对我来说,他们是丑陋的地狱,我希望,我从来没有保持一个。。。看看这个:-这是黑色艺术。不-正则表达式不会“全部替换”,因此甚至不是递增的replacements@Imre:嗯-你是绝对的。“regex不会“全部替换”?”?那是错误的。此外,通过一个helper函数,它可以进行增量替换。例如,检查我的答案。@Andreas_D:Huh,他使用正则表达式。好的,我使用fileinput添加了一个(更好的)选项:)@Andreas_D:Huh,他使用正则表达式。好的,我使用fileinput添加了一个(更好的)选项:)你可能想要++1,而不是1++。行号通常是以1为基础的……或者将
i
初始化为1而不是零。这是我需要的答案,带有正则表达式的答案。你可能想要++1,而不是1++。行号通常是以1为基础的……或者将
i
初始化为1而不是零。这就是我需要的答案,带有正则表达式的答案。