0

我试图在我的每个正则表达式匹配之前插入一个新行。目前我得到一个 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++;
}
4

3 回答 3

4

为什么不只是

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

也就是说,您的问题可能是 Environment.NewLine.Length 可能是 2,而不是 4。编辑:另外,正如 Cyborg 所指出的,Insert 不会修改字符串,而是返回一个新字符串。

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

于 2013-01-31T18:27:51.207 回答
1

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

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

  2. cleanFileContents.Insert(...)返回一个新字符串,它不会修改“cleanFileContents”。你需要类似的东西cleanFileContents = cleanFileContents.Insert(...)

建议的编辑:

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()
于 2013-01-31T18:34:29.833 回答
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();
}
于 2013-01-31T17:53:06.793 回答