查找并替换文件行

时间:2013-12-13 19:26:06

标签: c# regex

我有一个超过12,000行的文本文件。在该文件中,我需要替换某些行。 有些行以;开头,有些行有随机词,有些以空格开头。但是,我只关注下面描述的两种类型的线。

我有一行像

  SET    avariable:0      ;Comments

我需要将其替换为

  set    aDIFFvariable:0      :Integer      // comments

Integer I这个词中唯一必要的CASE需要大写。

我也有

  String aSTRING(7)      ;Comment

需要看起来像

  STRING aSTRING(7)           :array [0..7] of AnsiChar;      // Comments  

我需要保持所有间距相同。

这是我到目前为止的内容

static void Main(string[] args)
    {
        string text = File.ReadAllText("C:\\old.txt");
        text = text.Replace("old text", "new text");
        File.WriteAllText("C:\\new.txt", text);
    }

我想我需要使用REGEX,我试图在第一个例子中使用它:

\s\s[set]\s*{4}.*[:0]\s*[;].*< - 我现在知道这是无效的 - 请告知

我需要帮助才能正确设置程序以查找和替换这些行。我应该一次读一行,如果匹配,那么做点什么?我真的很困惑从哪里开始。

我想要做的简要伪代码

//open file
//step through file
//if line == [regex] then add/replace as needed
//else, go to next line
//if EOF, close file

1 个答案:

答案 0 :(得分:2)

分别对此进行一次尝试,因为每条线都是完全不同的,因此在同一个表达式中捕获它们将是一场噩梦。

要匹配您的第一个示例并替换它:

String input = "SET    avariable:0      ;Comments";
if (Regex.IsMatch(input, @"\s?(set)\s*(\w+):?(\d)\s+;?(.*)?"))
{
    input = Regex.Replace(input, @"\s?(set)\s*(\w+):?(\d)\s+;?(.*)?", "$1 $2:$3     :Integer // $4";
}

给它一个镜头(在这里玩它:http://regex101.com/r/zY7hV2

要匹配您的第二个示例并替换它:

String input = "String aSTRING(7)      ;Comments";
if (Regex.IsMatch(input, @"\s?(string)\s*(\w+)\((\d)\)\s*;(.*)"))
{
    input = Regex.Replace(input, @"\s?(string)\s*(\w+)\((\d)\)\s*;(.*)", "$1 $2($3) :array [0..$3] of AnsiChar; // $4";
}

在这里玩这个:http://regex101.com/r/jO5wP5