用于在某些标识符之间重复捕获组的正则表达式

时间:2014-01-23 11:08:44

标签: .net regex parsing regex-group

以下是我尝试解析的数据示例:

//lots of html source code
['unimportant','example data']
$(function() {

 var graph = new lineChart('chart-im-looking-for',
 {
  'width' : 1100, 'height' : 600,
  'font' : 'Arial',
  //more javascript code here
  'groups':
    [
    {
    //more javascript code here
    'values' : [
        {'x':1386374400, 'y':49.82, 'hover':['12/7',49.82], 'xlabel':'12/7'},
        {'x':1386460800, 'y':47.67, 'hover':['12/8',47.67], 'xlabel':'12/8'},
        {'x':1386547200, 'y':45.43, 'hover':['12/9',45.43], 'xlabel':'12/9'},
        {'x':1386633600, 'y':47, 'hover':['12/10',47], 'xlabel':'12/10'},
        {'x':1386720000, 'y':46.81, 'hover':['12/11',46.81], 'xlabel':'12/11'}
    ]
    }
    ]
  });
['unimportant','example data']
//lots of html source code

我需要将'hover'数组中的数据分成两组。请注意,在我需要获取数据的图表之前和之后有相同格式的图表,因此我需要通过其ID识别正确的图表(在此示例中为“chart-im-looking-for”)。 / p>

我尝试了以下正则表达式:

(?<=lineChart\('chart-im-looking-for'.*?'values'.*?)\['(.*?)',(.*?)]

如果我将它与'dot matches newline'选项一起使用,它会捕获values数组中的所有数据。但是,我不知道如何仅限制值数组的匹配,因此它在数组结束后捕获“不重要的示例数据”。我正在使用RegexBuddy进行测试,我将使用.net正则表达式。有什么帮助吗?

编辑:我宁愿避免对正则表达式中文档的格式做出任何假设,例如空格的位置(包括换行符)。

2 个答案:

答案 0 :(得分:1)

使用此正则表达式获取特定图表:

new lineChart\(['"]([^"']+)["'],\s*(.+?})\s*\)\s*;

使用添加的选项RegexOptions.Singleline,这将匹配到});的第一次出现,这就像我现场提出的那样强大。

此正则表达式的第一个捕获组将为您提供图表名称。第二个捕获组将为您提供完整的,最可能是可解析的JSON字符串。将其放入JSON解析器并访问“值”&gt;随意“悬停”。

See it live (ruby, but should work for .net aswell)

答案 1 :(得分:0)

您必须稍微更改模式为1)仅匹配(值)数组内的(悬停)数组,并且2)仅匹配正确值数组中的数组。这是我的尝试:

(?<=lineChart\('chart-im-looking-for'[^\$]*?'values'\s+:\s+\[([^\[]|\[[^\[]*\])*)\['(.*?)',(.*?)]
                                     ^^^^^<-2    2->^^^^^^/\^^^^^^^^<-1

这个正则表达式使用了一些关于文档结构的假设,例如: 'chart-im-looking-for'和''值'之间没有$符号,'value'后跟<whitespace>:<whitespace>[

编辑:它现在应匹配所有悬停数组。