3 回答

TA貢獻1817條經驗 獲得超6個贊
對于“聲明”,您可以匹配以下正則表達式。
/(?<=^ *SEND CLAIM +\{\r?\n(?:^(?! *SEND EOB *\{)(?! *SEND COB *\{).*\r?\n)*^ *PROCEDURE *)\{[^\}]*\}/
聲明正則表達式
這與以下字符串匹配,我認為可以輕松地將其保存到帶有少量 Javascript 代碼的數組中。
{ /* CLAIM #1 */
PROCEDURE_LINE="1"
PROCEDURE_CODE="01201"
}
{ /* CLAIM #2 */
PROCEDURE_LINE="2"
PROCEDURE_CODE="02102"
}
{ /* CLAIM #3 */
PROCEDURE_LINE="3"
PROCEDURE_CODE="21222"
}
Javascript 的正則表達式引擎執行以下操作。
(?<= : begin positive lookbehind
^ : match beginning of line
\ *SEND CLAIM\ + : match 'SEND CLAIM' surrounded by 0+ spaces
\{\r?\n : match '{' then line terminators
(?: : begin non-capture group
^ : match beginning of line
(?! : begin negative lookahead
\ *SEND EOB\ * : match 'SEND EOB' surrounded by 0+ spaces
\{ : match '{'
) : end negative lookahead
(?! : begin negative lookahead
\ *SEND COB\ * : match 'SEND COB' surrounded by 0+ spaces
\{ : match '{'
) : end negative lookahead
.*\r?\n : match line including terminators
) : end non-capture group
* : execute non-capture group 0+ times
^ : match beginning of line
\ *PROCEDURE\ * : match 'PROCEDURE' surrounded by 0+ spaces
) : end positive lookbehind
\{[^\}]*\} : match '{', 0+ characters other than '}', '}'
我已經在上面轉義了空格字符以提高可讀性。
對于“eob”,使用稍微修改的正則表達式:
/(?<=^ *SEND EOB +\{\r?\n(?:^(?! *SEND CLAIM *\{)(?! *SEND COB *\{).*\r?\n)*^ *PROCEDURE *)\{[^\}]*\}/
EOB 正則表達式
我沒有嘗試對“cob”做同樣的事情,因為該部分的結構與“claim”和“eob”不同,我不清楚如何處理它。
最后一點,如果不是很明顯:使用帶有循環的約定代碼和可能的簡單正則表達式來提取感興趣的字符串要容易得多,但我希望一些讀者可能會發現我的回答對正則表達式的某些元素具有指導意義.

TA貢獻1847條經驗 獲得超11個贊
將并始終保持相同的順序CLAIM?如果是這樣,您可以在使用已有的正則表達式之前拆分文本:EOBCOB
const procRegex = /(^\s+PROCEDURE\s\{)([\S\s]*?)(?:})/gm;
let claimData = data.split("EOB")[0];
let claimProcedures = claimData.match(procRegex);
let eobData = data.split("COB")[0].split("EOB")[1];
let eobProcedures = eobData.match(procRegex);
let cobData = data.split("COB")[1];
let cobProcedures = cobData.match(procRegex);
// If you want to leave out the PRIME_EOB, you can split COB again
cobData = cobData.split("EOB")[0];
cobProcedures = cobData.match(procRegex);
console.log(claimProcedures);
輸出:
[
' PROCEDURE { /* #1 */\n' +
' PROCEDURE_LINE="1"\n' +
' PROCEDURE_CODE="01201"\n' +
' \n' +
' }',
' PROCEDURE { /* #2 */\n' +
' PROCEDURE_LINE="2"\n' +
' PROCEDURE_CODE="02102"\n' +
' \n' +
' }',
' PROCEDURE { /* #3 */\n' +
' PROCEDURE_LINE="3"\n' +
' PROCEDURE_CODE="21222"\n' +
' \n' +
' }'
]
演示
作為一種替代方法,您的數據與有效的 JSON 相距不遠,因此您可以使用它來運行。下面的代碼將數據轉換為 JSON,然后將其解析為 Javascript 對象,您可以隨意使用該對象。
/* data cannot have Javascript comments in it for this to work, or you need
another regex to remove them */
data = data.replace(/=/g, ":") // replace = with :
.replace(/\s?{/g, ": {") // replace { with : {
.replace(/SEND/g, "") // remove "SEND"
.replace(/\"\s*$(?!\s*\})/gm, "\",") // add commas after object properties
.replace(/}(?=\s*\w)/g, "},") // add commas after objects
.replace(/(?<!\}),\s*PROCEDURE: /g, ",\nPROCEDURES: [") // start procedures list
.replace(/(PROCEDURE:[\S\s]*?\})\s*(?!,\s*PROCEDURE)/g, "$1]\n") // end list
.replace(/PROCEDURE: /g, "") // remove "PROCEDURE"
.replace("PRIME_EOB: EOB:", "PRIME_EOB:") // replace double key with single key. Is this the behavior you want?
.replace(/(\S*):/g, "\"$1\":") // put quotes around object key names
let dataObj = JSON.parse("{" + data + "}");
console.log(dataObj.CLAIM.PROCEDURES);
輸出:
[ { PROCEDURE_LINE: '1', PROCEDURE_CODE: '01201' },
{ PROCEDURE_LINE: '2', PROCEDURE_CODE: '02102' },
{ PROCEDURE_LINE: '3', PROCEDURE_CODE: '21222' } ]

TA貢獻1786條經驗 獲得超11個贊
您要做的是為文本文件中使用的語法編寫一個解析器。
如果看一下語法,它看起來很像 JSON。
我建議使用正則表達式修改語法以獲得有效的 JSON 語法并使用 JavaScript JSON 解析器對其進行解析。解析器能夠處理遞歸。最后,您將擁有一個 JavaScript 對象,該對象允許您刪除或添加您需要的任何內容。此外,源的層次結構將被保留。
此代碼為提供的示例完成了工作:
let data = ` SEND CLAIM {
// your text file contents
}`;
// handle PRIME_EOB=SEND EOB {
var regex = /(\w+)=\w+.*{/gm;
var replace = data.replace(regex, "$1 {");
// append double quotes in lines like PROCEDURE_LINE="1"
var regex = /(\w+)=/g;
var replace = replace.replace(regex, "\"$1\": ");
// append double quotes in lines like PROCEDURE {
var regex = /(\w+.*)\s{/g;
var replace = replace.replace(regex, "\"$1\": {");
// remove comments: /* */
var regex = /\/\**.*\*\//g;
var replace = replace.replace(regex, "");
// append commas to lines i.e. "PROCEDURE_LINE": "2"
var regex = /(\".*\":\s*\".*\")/gm;
var replace = replace.replace(regex, "$1,");
// append commas to '}'
var regex = /^.*}.*$/gm;
var replace = replace.replace(regex, "},");
// remove trailing commas
var regex = /\,(?!\s*?[\{\[\"\'\w])/g;
var replace = replace.replace(regex, "");
// surround with {}
replace = "{" + replace + "}";
console.log(replace);
var obj = JSON.parse(replace);
console.log(obj);
JSON 看起來像這個片段:
{ "SEND CLAIM": {
"PREFIX": "9403 ",
"PROCEDURE": {
"PROCEDURE_LINE": "1",
"PROCEDURE_CODE": "01201"
},
"PROCEDURE": {
"PROCEDURE_LINE": "2",
"PROCEDURE_CODE": "02102"
最終對象像這樣出現在調試器中
我并不完全清楚你的最終數組或對象應該是什么樣子。但從這里開始,我預計只需很少的努力就能產生你想要的東西。
添加回答
舉報