我尝试用C#中的文件替换一些换行符,给定一个特定的模式:
(?m)(^\t[0-9A-Z#].+$)\r?\n
文件示例结构
1 1 1 1
ab as as
123 1 2
13
32 3 12 2
ds ds 12
将$1\t
应用为替换,我希望得到以下结果:
1 1 1 1 ab as as
123 1 2 13
32 3 12 2 ds ds 12
事实上,此替换在regexr正常工作。
但是在C#中,文件只返回没有匹配项。这个正则表达式中有任何特殊性.net匹配差异吗?
public void masterDataEleb()
{
// Tried both with (?m) and RegexOptions.Multiline, not working
Regex masterDataRegex = new Regex(@"(^\t[0-9A-Z#].+$)\r?\n", RegexOptions.Multiline);
string replaceTo = "$1\t";
string textFile = File.ReadAllText(filePath, Encoding.Default);
textFile = masterDataRegex.Replace(textFile, replaceTo);
File.WriteAllText(filePath, textFile, Encoding.Default);
}
答案 0 :(得分:1)
在表达式结束时(忽略捕获组),您有序列:
$\r?\n
在.NET中使用RegexOptions.Multiline时,$
锚点贪婪地匹配LF
。您的匹配失败,因为您的文件中没有序列LFCRLF
或LFLF
。
您应该尝试使用模式\r?$
来匹配行尾。
你的模式在regexr上工作的原因可能是$
锚的行为不同(例如,regexr的行为在LF之前似乎与$
匹配,尽管我怀疑它可能由于类似的原因,输入行以CRLF结尾失败。
答案 1 :(得分:0)
这可能会对你有所帮助。替换为$1\t$2$3
([^\r\n]*)\r?\n([^\r\n]*)(\r?\n?)
模式说明:
([^\r\n]*) Group everything till new line is found
\r?\n New line is found
([^\r\n]*) Group everything till new line is found
(\r?\n?) New line is found(optional)