使用Regex系统的IndexOutOfRangeException

时间:2017-07-24 22:49:05

标签: c# regex winforms

我正在尝试制作一个Reddit Formatter工具,只要你有一个只有一个换行符的文本来添加另一个换行符并创建一个新的段落。在StackOverflow中它是相同的,你必须按两次回车键才能开始一个新的段落。它来自:

 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语句启动的行中抛出错误

会发生什么?我不知道发生了什么

非常感谢

1 个答案:

答案 0 :(得分:3)

  

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

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

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

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

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