插入到基于正则表达式匹配索引的字符串中

本文关键字:索引 字符串 正则表达式 插入 | 更新日期: 2023-09-27 17:56:47

我正在尝试在每个正则表达式匹配之前插入一个新行。目前我得到一个参数超出范围异常。我意识到索引需要为我插入的所有新行字符偏移(总共 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++;
}

插入到基于正则表达式匹配索引的字符串中

为什么不只是

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

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

顺便说一下,如果你试图匹配文字括号,你需要转义它们。

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

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

  2. cleanFileContents.Insert(...)返回一个新字符串,它不会修改"cleanFileContent"。你需要类似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()

我不遵循逻辑
火柴。索引 + 4 * 计数器
你知道 * 在 + 之前应用吗?

类似于 Cyborgx37 - 当我开始这个时
它没有发布在换行时拆分的"全部读取"行可能更快

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();
}