首页 > 解决方案 > RegEx for matching specific attributes and values

问题描述

I am trying to strip a huge XML file without containing all the useless information.The file will look something like this:

App_Data App="MOD" Name="Genre" Value="Series"/><App_Data App="MOD" 
Name="Show_Type" Value="Series"/><App_Data App="MOD" Name="Billing_ID" 
Value="10092"/><App_Data App="MOD" Name="Licensing_Window_Start" 
Value="2019-05-07 00:00:00"/><App_Data App="MOD" 
Name="Licensing_Window_End" Value="2019-05-13 23:59:59"/><App_Data 
App="MOD" Name="Preview_Period" Value="0"/><App_Data App="MOD" 
Name="Display_As_New" Value="4"/><App_Data App="MOD" 
Name="Display_As_Last_Chance" Value="7"/><App_Data App="MOD" 
Name="Provider_QA_Contact" Value="NBC Universal"/><App_Data App="MOD" 
Name="Suggested_Price" Value="0.00"/><App_Data App="MOD" 

I will need to find values for Show_Type, Licensing_Window_end, and Display_as_New

So, how can I turn my output string into something like this:

Name="Show_Type" Value="Series"
Name="Licensing_Window_End" Value="2019-05-13 23:59:59"
Name="Display_As_New" Value="4"

Currently, I have something like this:

  stripText(text) {
      return text.match(new RegExp("Show_Type" + "(.*)" + "/>"));

  }

But this only gets the first variable. and will include some useless information such as the /> ending part.

标签: javascriptregexregex-lookaroundsregex-groupregex-greedy

解决方案


我认为它必须有效:

const text = `App_Data App="MOD" Name="Genre" Value="Series"/><App_Data App="MOD" 
Name="Show_Type" Value="Series fasfdasdf"/><App_Data App="MOD" Name="Billing_ID" 
Value="10092"/><App_Data App="MOD" Name="Licensing_Window_Start" 
Value="2019-05-07 00:00:00"/><App_Data App="MOD" 
Name="Licensing_Window_End" Value="2019-05-13 23:59:59"/><App_Data 
App="MOD" Name="Preview_Period" Value="0"/><App_Data App="MOD" 
Name="Display_As_New" Value="4"/><App_Data App="MOD" 
Name="Display_As_Last_Chance" Value="7"/><App_Data App="MOD" 
Name="Provider_QA_Contact" Value="NBC Universal"/><App_Data App="MOD" 
Name="Suggested_Price" Value="0.00"/><App_Data App="MOD"`

const result = text.match(/[Nn]ame\="(Show_Type|Licensing_Window_End|Display_As_New)"\s+[Vv]alue\="[^"]*"/g)

console.log(result)

在此处输入图像描述

我不知道您将如何使用这些数据,但您可能会发现一个由对象表示的模型很有用,其中属性“name”是键,属性“values”是值的数组(我复制了字符串 shared并更改重复值以获得更好的示例):

在此处输入图像描述

const text = `App_Data App="MOD" Name="Genre" Value="Series"/><App_Data App="MOD" 
Name="Show_Type" Value="Series"/><App_Data App="MOD" Name="Billing_ID" 
Value="10092"/><App_Data App="MOD" Name="Licensing_Window_Start" 
Value="2019-05-07 00:00:00"/><App_Data App="MOD" 
Name="Licensing_Window_End" Value="2019-05-13 23:59:59"/><App_Data 
App="MOD" Name="Preview_Period" Value="0"/><App_Data App="MOD" 
Name="Display_As_New" Value="4"/><App_Data App="MOD" 
Name="Display_As_Last_Chance" Value="7"/><App_Data App="MOD" 
Name="Provider_QA_Contact" Value="NBC Universal"/><App_Data App="MOD" 
Name="Suggested_Price" Value="0.00"/><App_Data App="MOD"
App_Data App="MOD" Name="Genre" Value="Series"/><App_Data App="MOD" 
Name="Show_Type" Value="Series 2"/><App_Data App="MOD" Name="Billing_ID" 
Value="10092"/><App_Data App="MOD" Name="Licensing_Window_Start" 
Value="2019-05-07 00:00:00"/><App_Data App="MOD" 
Name="Licensing_Window_End" Value="2020-05-13 00:59:59"/><App_Data 
App="MOD" Name="Preview_Period" Value="0"/><App_Data App="MOD" 
Name="Display_As_New" Value="15"/><App_Data App="MOD" 
Name="Display_As_Last_Chance" Value="7"/><App_Data App="MOD" 
Name="Provider_QA_Contact" Value="NBC Universal"/><App_Data App="MOD" 
Name="Suggested_Price" Value="0.00"/><App_Data App="MOD" 
`

const result = text.match(/[Nn]ame\="(Show_Type|Licensing_Window_End|Display_As_New)"\s+[Vv]alue\="[^"]*"/g)

const objectResult = {
  show_type: [],
  licensing_window_end: [],
  display_as_new: [],
}

result.forEach((e)=>{
  const nameAndValue = e.match(/[Nn]ame\="(Show_Type|Licensing_Window_End|Display_As_New)"\s+[Vv]alue\="([^"]*)"/)
  switch (nameAndValue[1]) {
    case "Show_Type":
      objectResult.show_type.push(nameAndValue[2])
      break;
    case "Licensing_Window_End":
      objectResult.licensing_window_end.push(nameAndValue[2])
      break;
    case "Display_As_New":
      objectResult.display_as_new.push(nameAndValue[2])
      break;
    default:
      break;
  }
})

console.log(objectResult)


推荐阅读