正则表达式,用于匹配特定的属性和值

时间:2019-05-07 21:16:37

标签: javascript regex regex-lookarounds regex-group regex-greedy

我正在尝试剥离一个巨大的XML文件而不包含所有无用的信息。该文件看起来像这样:

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" 

我将需要找到Show_Type, Licensing_Window_end, and Display_as_New的值

因此,如何将我的输出字符串转换为以下内容:

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

目前,我有这样的事情:

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

  }

但这仅获得第一个变量。并将包含一些无用的信息,例如/>结束部分。

4 个答案:

答案 0 :(得分:0)

从技术上讲,您可以通过#include <asm/termios.h> /* asm gives us the all important BOTHER and TCGETS2 */ #include <fcntl.h> #include <dirent.h> #include <stropts.h> /* Oddly, for ioctl, because ioctl.h causes include dramas */ setNonStandardBaudRateTermios(int fd, int baudrate, eParitySetting parity, int numStopBits) { //All the termios2/ioctl/TCGETS2/BOTHER things } 将字符串转换为XML并以此方式循环。您将需要一些if语句来获取正确的属性。

DOMParser

答案 1 :(得分:0)

This expression可能会帮助您:

^(Name=")(Show_Type"|Licensing_Window_End"|Display_As_New")(\s+Value="[A-Za-z0-9-:\s]+")([\/>\s]+)(.*)$

为了安全起见,我添加了几个界限。如果您愿意,可以减少这些界限。我还添加了几个捕获组,以便于调用。

enter image description here

此图显示了表达式的工作方式:

enter image description here

边界

减少边界的一种方法是删除名称值,类似于this expression

^(Name=")([A-Za-z\s\x22_]+)(\s+Value="[A-Za-z0-9-:\s]+")([\/>\s]+)(.*)$

enter image description here

enter image description here

性能

此JavaScript代码段使用一个简单的100万次for循环在其中一个输入上显示了此表达式的性能,您可以使用$1$2$3在输入上执行字符串替换。

    repeat = 1000000;
    start = Date.now();
    
    for (var i = repeat; i >= 0; i--) {
    	var string = 'Name="Licensing_Window_End" Value="2019-05-13 23:59:59"/><App_Data';
    	var regex = /^(Name=")(Show_Type"|Licensing_Window_End"|Display_As_New")(\s+Value="[A-Za-z0-9-:\s]+")([\/>\s]+)(.*)$/g;
    	var match = string.replace(regex, "$1$2$3");
    }
    
    end = Date.now() - start;
    console.log("YAAAY! \"" + match + "\" is a match  ");
    console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test.  ");

答案 2 :(得分:0)

建议先使用xml解析器,然后删除所需的字段,然后再次保存xml。我不建议您使用文本字符串搜索来删除XML字段,因为xml是结构化数据,应使用正确的工具完成正确的工作。

https://www.w3schools.com/xml/xml_parser.asp

答案 3 :(得分:0)

我认为它必须可行:

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)

enter image description here

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

enter image description here

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)