亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

字符串后的正則表達式多行匹配

字符串后的正則表達式多行匹配

絕地無雙 2022-11-11 15:00:44
我正在嘗試從文本文件中提取&中的PROCEDURE部分。CLAIMEOBCOB并像這樣創建一個對象claim : [{PROCEDURE1}, {PROCEDURE2}, {PROCEDURE3}],eob : [{PROCEDURE1}, {PROCEDURE2}, {PROCEDURE3}],cob: [{PROCEDURE1}, {PROCEDURE2}, {PROCEDURE3}]let data = `    SEND CLAIM {       PREFIX="9403        "       PROCEDURE { /* #1  */          PROCEDURE_LINE="1"          PROCEDURE_CODE="01201"               }       PROCEDURE { /* #2  */          PROCEDURE_LINE="2"          PROCEDURE_CODE="02102"                }       PROCEDURE { /* #3  */          PROCEDURE_LINE="3"          PROCEDURE_CODE="21222"              }    }        SEND EOB {          PREFIX="9403        "          OFFICE_SEQUENCE="000721"          PROCEDURE { /* #1 */             PROCEDURE_LINE="1"             ELIGIBLE="002750"          }          PROCEDURE { /* #2 */             PROCEDURE_LINE="2"             ELIGIBLE="008725"          }          PROCEDURE { /* #3 */             PROCEDURE_LINE="3"             ELIGIBLE="010200"          }    }        SEND COB {       PREFIX="TEST4       "       OFFICE_SEQUENCE="000721"       PROCEDURE { /* #1  */          PROCEDURE_LINE="1"          PROCEDURE_CODE="01201"               }       PROCEDURE { /* #2  */          PROCEDURE_LINE="2"          PROCEDURE_CODE="02102"       }       PROCEDURE { /* #3  */          PROCEDURE_LINE="3"          PROCEDURE_CODE="21222"          DATE="19990104"       }       PRIME_EOB=SEND EOB {          PREFIX="9403        "          OFFICE_SEQUENCE="000721"          PROCEDURE { /* #1 */             PROCEDURE_LINE="1"             ELIGIBLE="002750"          }          PROCEDURE { /* #2 */             PROCEDURE_LINE="2"             ELIGIBLE="008725"          }          PROCEDURE { /* #3 */             PROCEDURE_LINE="3"             ELIGIBLE="010200"          }           }    }`        let re = /(^\s+PROCEDURE\s\{)([\S\s]*?)(?:})/gm        console.log(data.match(re));到目前為止,這是我嘗試過的(^\s+PROCEDURE\s\{)([\S\s]*?)(?:}),但我不知道如何PROCEDURE在 keyCLAIM或EOB
查看完整描述

3 回答

?
慕的地6264312

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”不同,我不清楚如何處理它。


最后一點,如果不是很明顯:使用帶有循環的約定代碼和可能的簡單正則表達式來提取感興趣的字符串要容易得多,但我希望一些讀者可能會發現我的回答對正則表達式的某些元素具有指導意義.


查看完整回答
反對 回復 2022-11-11
?
回首憶惘然

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' } ]


查看完整回答
反對 回復 2022-11-11
?
Qyouu

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"

最終對象像這樣出現在調試器中

http://img1.sycdn.imooc.com//636df3550001725605860157.jpg

我并不完全清楚你的最終數組或對象應該是什么樣子。但從這里開始,我預計只需很少的努力就能產生你想要的東西。



查看完整回答
反對 回復 2022-11-11
  • 3 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號