0

我在这里遇到的有趣情况。我在一个文件夹中有一些文件,它们在第一行都有一个非常明确的字符串,我总是知道会在那里。想要我想做的真的只是|DATA_SOURCE_KEY在后面追加AVAILABLE_IND

//regex to search for the bb_course_*.bbd files
  string courseRegex = @"BB_COURSES_([C][E][Q]|[F][A]|[H][S]|[S][1]|[S][2]|[S][P])\d{1,6}.bbd";
  string courseHeaderRegex = @"EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND";

//get files from the directory specifed in the GetFiles parameter and returns the matches to the regex
   var matches = Directory.GetFiles(@"c:\courseFolder\").Where(path => Regex.Match(path, courseRegex).Success);

//prints the files returned
            foreach (string file in matches)
            {
                Console.WriteLine(file);
                File.WriteAllText(file, Regex.Replace(File.ReadAllText(file), courseHeaderRegex, "EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND|DATA_SOURCE_KEY"));
            }

但是这段代码采用匹配正则表达式的原始出现,用我的替换值替换它,然后再执行 3 次。

EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND|DATA_SOURCE_KEY|EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND|DATA_SOURCE_KEY|EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND|DATA_SOURCE_KEY|EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND|DATA_SOURCE_KEY

而且我无法弄清楚为什么要使用断点。我的循环只运行了 12 次以匹配我在目录中拥有的文件数。我唯一的猜测是 File.WriteAllText 在替换文本并重新替换后以某种方式递归搜索自身。如果这是有道理的。有任何想法吗?是不是因为courseHeaderRegex太显眼了?

如果我courseHeaderRegex改为string courseHeaderRegex = @"AVAILABLE_IND";

然后我在我的文件中得到正确的更改

EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND|DATA_SOURCE_KEY

我只是想了解为什么原来的方式行不通。

4

2 回答 2

3

我认为你的问题是你需要逃避 | courseHeaderRegex 中的字符:

string courseHeaderRegex = @"EXTERNAL_COURSE_KEY\|COURSE_ID\|COURSE_NAME\|AVAILABLE_IND";

性格 | 是交替运算符,它将匹配 'EXTERNAL_COURSE_KEY' 、 'COURSE_ID' 、 、'COURSE_NAME' 和 'AVAILABLE_IND' ,用您的替换字符串替换它们中的每一个。

于 2013-07-30T20:54:08.953 回答
1

关于什么

string newString = File.ReadAllText(file)
    .Replace(@"EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND",@"EXTERNAL_COURSE_KEY|COURSE_ID|COURSE_NAME|AVAILABLE_IND|DATA_SOURCE_KEY");

只需使用一个简单的 String.Replace()

于 2013-07-30T20:54:23.290 回答