我正在使用包含多个文件的巨型文本文件 里面的文件。这些文档具有非常相似的界面,具有固定字段 和动态值。我需要在数组中分离这些文档。
示例:
[
[] <- 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
答案 0 :(得分:0)
最好不要使用正则表达式,尤其是对于大型文档。使用indexOf():
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;
答案 1 :(得分:0)
首先我相信你的正则表达式中有一个拼写错误它应该[\s\S]
而不是[\S\S]
注意小写s
。这正确地匹配了整行。
这个正则表达式可以完成匹配这样一个文档所需的内容,有人可以制作更优化的版本:
/(?:DOC_START|OTHER_START)([\s\S]*?)(?:DOC_FINAL|OTHER_FINAL)/g
另一方面,如果可能的话,我宁愿建议您采用不同的方法。例如,如果您在NodeJS中执行此操作,我强烈建议您对DOC_START
或DOC_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>