使用正则表达式分隔符

时间:2016-06-08 14:54:45

标签: javascript regex

我正在使用包含多个文件的巨型文本文件 里面的文件。这些文档具有非常相似的界面,具有固定字段 和动态值。我需要在数组中分离这些文档。

示例:

[
   [] <- Doc1
   [] <- Doc2
   [] <- Doc3
   [] <- Doc4
   ...
   ...
   ...
]

为此,我需要创建一个定义分隔符的正则表达式,doc开始的地方和结束的地方。

示例:

DOC_START
TEXT
TEXT
TEXT
TEXT
DOC_FINAL
DOC_START
TEXT
TEXT
TEXT
TEXT
DOC_FINAL

REGEX:((?:DOC_START)(?:[\S\S]+)(?:DOC_FINAL)?)

问题是:某些文档可能有特殊性,开头或结尾有点不同,所以我需要能够传递开始和结束选项。

我的问题:我怎么能这样做?我怎样才能改进正则表达式?

为了清楚起见,有时候,文档的开头或结尾可能会略有不同。例如:

DOC_START
TEXT
TEXT
TEXT
TEXT
DOC_FINAL
DOC_START
TEXT
TEXT
TEXT
TEXT
DOC_FINAL
OTHER_START
TEXT
TEXT
TEXT
TEXT
DOC_FINAL
DOC_START
TEXT
TEXT
TEXT
TEXT
OTHER_FINAL
OTHER_START
TEXT
TEXT
TEXT
TEXT
OTHER_FINAL

2 个答案:

答案 0 :(得分:0)

最好不要使用正则表达式,尤其是对于大型文档。使用indexOf():

&#13;
&#13;
 var hugeDoc = 'DOC_STARTxxDOC_ENDOTHER_STARTyyOTHER_END'; 
        var result = [];
        var start =0;

        var possibleDelimiters = [ 
                {'start': 'OTHER_START', 'end':'OTHER_END'},
                {'start': 'DOC_START', 'end':'DOC_END'}
        ];

        function parseDoc(delimiter) {
                var end = hugeDoc.indexOf(delimiter.end, start);
                if(!end) return false;
                result.push(hugeDoc.slice(start+delimiter.start.length, end));
                //add +1 here, if you have a new line after DOC_END
                start = end+delimiter.end.length;
                return true;
        }

        do {
                var found = false;
                for(ix in possibleDelimiters) {
                        var delimiter = possibleDelimiters[ix];
                        if(hugeDoc.indexOf(delimiter.start, start) === start) {
                                found = parseDoc(delimiter) || found;
                        }
                }
        } while(found);

var node = document.getElementById('result');
node.innerHTML = JSON.stringify(result);
&#13;
<html>
  <body>
    <div id="result"></div>
    </body>
</html>
    
&#13;
&#13;
&#13;

答案 1 :(得分:0)

首先我相信你的正则表达式中有一个拼写错误它应该[\s\S]而不是[\S\S]注意小写s。这正确地匹配了整行。

这个正则表达式可以完成匹配这样一个文档所需的内容,有人可以制作更优化的版本:

/(?:DOC_START|OTHER_START)([\s\S]*?)(?:DOC_FINAL|OTHER_FINAL)/g

另一方面,如果可能的话,我宁愿建议您采用不同的方法。例如,如果您在NodeJS中执行此操作,我强烈建议您对DOC_STARTDOC_END分隔符执行每行检查。然后用行填充数组,直到结束分隔符。

假设您想要在每个文档中包含一系列行,请执行以下松散伪代码:

create resulting object ({ doc1: null })
read line
if start delimiter
  if current object property is null
    create array (doc#: [])
else if end delimiter
  create new doc property (doc2: null)
else
  add line to array

另一个注意事项如果您使用HTML执行此操作我强烈建议您不要使用正则表达式,因为HTML不是常规语言:)您会发现SO上的许多链接指向evil。< / p>