有趣的情况我在这里。我在一个文件夹中有一些文件,在第一行中都有一个非常明确的字符串,我总是知道它会在那里。我想要做的只是在|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
我只想了解为什么原始方式不起作用。
答案 0 :(得分:3)
我认为你的问题是你需要逃避| courseHeaderRegex中的字符:
string courseHeaderRegex = @"EXTERNAL_COURSE_KEY\|COURSE_ID\|COURSE_NAME\|AVAILABLE_IND";
角色|是交替运算符,它将匹配'EXTERNAL_COURSE_KEY','COURSE_ID','COURSE_NAME'和'AVAILABLE_IND',用替换字符串替换它们。
答案 1 :(得分: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()