根据正则表达式匹配索引插入字符串

时间:2013-01-31 17:44:51

标签: c# .net regex

我想在每个正则表达式匹配之前插入一个新行。目前我收到了ArgumentOutOfRangeException。我意识到索引需要为我正在插入的所有新行字符(总共4个字符)进行偏移。

你们有什么办法解决这个问题吗?

谢谢!

string origFileContents = File.ReadAllText(path);

string cleanFileContents = origFileContents.Replace("\n", "").Replace("\r", "");

Regex regex = new Regex(@"([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9a-zA-Z]*--)", RegexOptions.Singleline);
MatchCollection matches = regex.Matches(cleanFileContents);

int counter = 0;

foreach (Match match in matches)
{
    cleanFileContents.Insert(match.Index + 4 * counter, Environment.NewLine);
    counter++;
}

3 个答案:

答案 0 :(得分:4)

为什么不

cleanFileContents = regex.Replace(
    cleanFileContents,
    Environment.NewLine + "$0");

那就是说,你的问题可能是Environment.NewLine.Length可能是2,而不是4.编辑:同样,正如Cyborg指出的那样,Insert不会修改字符串,但会返回一个新字符串

顺便说一句,如果您尝试匹配文字括号,则需要将其转义。

答案 1 :(得分:1)

我在这段代码中至少看到了这些可识别的问题。

  1. "\r\n"是两个字符,而不是4.您应该使用Environment.NewLine.Length * counter

  2. cleanFileContents.Insert(...)返回一个新字符串,它不会修改' cleanFileContents'。您需要cleanFileContents = cleanFileContents.Insert(...)

  3. 之类的内容

    建议编辑:

    string origFileContents = File.ReadAllText(path);
    
    // Changed cleanFileContents to a StringBuilder for performance reasons
    var cleanFileContents = New StringBuilder( origFileContents.Replace("\n", "").Replace("\r", "") );
    
    Regex regex = new Regex(@"([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9a-zA-Z]*--)", RegexOptions.Singleline);
    MatchCollection matches = regex.Matches(cleanFileContents.ToString());
    
    int counter = 0;
    
    foreach (Match match in matches)
    {
        cleanFileContents.Insert(match.Index + Environment.NewLine.Length * counter, Environment.NewLine);
        counter++;
    }
    
    var result = cleanFileContents.ToString()
    

答案 2 :(得分:0)

我没有遵循上的逻辑 match.Index + 4 * counter
你知道*是在+之前应用的吗?

与Cyborgx37类似 - 当我开始这个时,它没有发布 用于拆分换行的ReadAllLines可能更快

Regex regex = new Regex(@"([0-9]{4}-[0-9]{2}-[0-9]{2}_[0-9a-zA-Z]*--)", RegexOptions.Singleline);
StringBuilder sbAll = new StringBuilder();
StringBuilder sbLine = new StringBuilder();
foreach (string line in System.IO.File.ReadAllLines("path"))
{
    sbLine.Append(line);
    MatchCollection matches = regex.Matches(line);

    int counter = 0;

    foreach (Match match in matches)
    {
        sbLine.Insert(match.Index + Environment.NewLine.Length * counter, Environment.NewLine);
        counter++;
    }
    sbAll.Append(line);
    sbLine.Clear();
}