带有正则表达式系统的 IndexOutOfRangeException

Posted

技术标签:

【中文标题】带有正则表达式系统的 IndexOutOfRangeException【英文标题】:IndexOutOfRangeException with Regex system 【发布时间】:2017-12-30 16:04:30 【问题描述】:

我正在尝试制作一个 Reddit Formatter 工具,用于每当您有一个只有一个换行符的文本来添加另一个并创建一个新段落时。在 *** 中也是一样的,你必须按两次 Enter 键才能开始一个新段落。它来自:

 Roses are red
 Violets are Blue

 Roses are red

 Violets are Blue

这很好,但如果它已经是一个双精度字符,我不想添加多个输入字符。我不想离开

 Roses are red

 Violets are Blue

 Roses are red


 Violets are Blue

因为它已经作为第一个示例工作了。如果你一直按住按钮,它只会无限增加更多的行。

在这个论坛的某个人的帮助下,我已经尝试过了:

        for (int i = textBox1.Text.Length - 1; i >= 0; i--)
        
            if (textBox1.Text[i] == '\u000A')//if finds a SINGLE new line
            
                    textBox1.Text = Regex.Replace(textBox1.Text, "(?:\r\n)+", "\r\n\r\n");
                
             
        

而且它可以完美运行...直到您连续输入超过 5 个输入键。然后它因 System.IndexOutOfRangeException 而崩溃。我确定错误来自正则表达式方法,尽管它会在 if 语句开始的行中引发错误

会发生什么?我不明白发生了什么

非常感谢

【问题讨论】:

textBox1.Text 每次迭代都会被替换,但索引是基于初始值的。我建议隔离此代码以编写单元测试。然后使用您上面提到的案例创建一个失败的单元测试,以及其他测试。然后简单地修复代码以使测试通过。 为什么要删除上一个问题? 【参考方案1】:

我确定错误来自正则表达式方法, 虽然它会在 if 语句开始的行中抛出错误

抛出错误是因为您试图访问一个不存在的位置。 i 的值大于字符串 textBox1.Text 中的元素数量。发生这种情况的原因是因为您更改了这一行的字符串:

textBox1.Text = Regex.Replace(textBox1.Text, "(?:\r\n)+", "\r\n\r\n");

Replace 返回分配给textBox1.Text 的新字符串。在这一行中,大量的 \r\n 仅被 2 次替换。您的字符串(在连续超过 5 个输入键的情况下)的长度被缩短,因此 for 循环的下一次迭代变量 i 大于字符数在你的字符串中。

由于Regex.Replace 将搜索您传递给它的整个字符串,因此不需要循环和 if- 子句。您可以简单地使用此行,如果找到匹配项,它将始终将 2 个出现的 \r\n 放入字符串中。您基本上会进行两次匹配,一次在 if 子句中,一次在 RegEx 调用中。

【讨论】:

哇,非常感谢,我将它用作简单的替换功能,现在我已经删除了循环它可以完美运行:) 感谢您的明确解释!

以上是关于带有正则表达式系统的 IndexOutOfRangeException的主要内容,如果未能解决你的问题,请参考以下文章

带有正则表达式替换的特殊符号

带有 jQ​​uery 的 Javascript 正则表达式包含正则表达式扩展

当正则表达式包含 \w 时,带有 label_replace 的 promql 正则表达式返回空白值

带有\b和国际字符的Javascript正则表达式问题

带有正则表达式的 Django 过滤器

正则表达式转义带有注释的行