为了账号安全,请及时绑定邮箱和手机立即绑定

字符串后的正则表达式多行匹配

字符串后的正则表达式多行匹配

绝地无双 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"

最终对象像这样出现在调试器中

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

我并不完全清楚你的最终数组或对象应该是什么样子。但从这里开始,我预计只需很少的努力就能产生你想要的东西。



查看完整回答
反对 回复 2022-11-11
  • 3 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号