如果不匹配,.NET正则表达式超时

时间:2014-05-22 19:56:44

标签: c# .net regex

我有一个大字符串,格式如下:

{"_index":"2","_t":"g","_id":"3","_source":{"Id":3,"C":3,"PortfolioIdList":[1,3,4],"TISList":[1,2]}
,"sort":[3000]}

PortfolioIdList可以为空[],也可以包含数字,如上所示。想法是在PortfolioIdList中插入另一个数字,当且仅当它包含数字时,即它不为空。我为此写了一个正则表达式,它正在超时。正则表达式是:

const string STR_REGEX = @"(\{"")(_)(index"":)(.*?)(""_id"":"")([0-9]*)("")(.*?)(\{.*?""PortfolioIdList"":\[(?!\]))([^\]]*)(\][^\}]*)((.|\r|\n|\r\n|[^\}])*\},)";
var myRegex = new Regex(STR_REGEX, RegexOptions.None);
var strTargetString = File.ReadAllText(@"raw1.txt");
const string STR_REPLACE = @"${1}${3}${5}${6}${7}${8},""_parent"":""${6}""}}\r\n${10}${11},2344${12}\r\n";
var newStr = myRegex.Replace(strTargetString, STR_REPLACE);

正则表达式在列表不为空的情况下正常工作,但是当列表为空时它会超时,例如"PortfolioIdList":[]。我真的不确定我的正则表达式有什么问题,任何帮助都会受到极大的赞赏。

1 个答案:

答案 0 :(得分:0)

所以我遇到的问题是,在没有匹配的情况下,正则表达式保持回溯到第一行(在数千行文本中),这需要非常大的数量来计算。

我按照以下方式解决了问题:

  1. 这个post帮助我删除了不必要的回溯
  2. 我使用this MSDN帖子有条件地替换了文本