正则表达式在.Net中不能正常工作

时间:2014-07-22 13:42:54

标签: c# .net regex

我尝试用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);
}

2 个答案:

答案 0 :(得分:1)

在表达式结束时(忽略捕获组),您有序列:

$\r?\n

在.NET中使用RegexOptions.Multiline时,$锚点贪婪地匹配LF。您的匹配失败,因为您的文件中没有序列LFCRLFLFLF

您应该尝试使用模式\r?$来匹配行尾。

你的模式在regexr上工作的原因可能是$锚的行为不同(例如,regexr的行为在LF之前似乎与$匹配,尽管我怀疑它可能由于类似的原因,输入行以CRLF结尾失败。

答案 1 :(得分:0)

这可能会对你有所帮助。替换为$1\t$2$3

([^\r\n]*)\r?\n([^\r\n]*)(\r?\n?)

Online demo

模式说明:

([^\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)