提问者:小点点

javascript多个正则表达式匹配


给定下面的字符串

[NeMo(PROD)]10.10.100.100(EFA-B-3)[博科FC-Switch]传感器:电源#1(SNMP自定义表)关闭(无此名称(SNMP错误#2))

我尝试获取多个匹配项以提取以下值:

var system = "PROD";
var ip = "10.10.100.100";
var location = "EFA-B-3";
var device = "Brocade FC-Switch";
var sensor = "Sensor: Power Supply #1";
var sensorArt = "SNMP Custom Table";
var sensorState = "Down";
var errorMsg = "No Such Name (SNMP error # 2)";

因为我是正则表达式的初学者,所以我试图定义一些“规则”:

  1. 提取第一个圆括号内的第一个值,例如PROD
  2. 提取第一个闭合方括号和第二个开口圆括号之间的值,例如10.10.100.100
  3. 提取第二个圆括号内的值,例如EFA-B-3
  4. 提取第二个方括号内的值。博科FC-Switch
  5. 提取第二个闭合方括号和第三个开口圆括号之间的值例如。传感器:电源#1
  6. 提取第三个圆括号内的值。SNMP自定义表
  7. 提取第三个闭合圆托槽和第四个开口圆托槽之间的值例如。下
  8. 提取第四个圆括号内的值。没有这样的名称(SNMP错误#2)

使用网页https://scriptular.com/我努力实现我的目标。到目前为止,我成功地构建了正则表达式

(?=(([^)] )))

这给了我第一场比赛(规则1)。不知何故,我没有声明正则表达式在括号之间。我错过了什么?


共1个答案

匿名用户

由于没有办法定义分隔符,唯一的方法是匹配部件并分别捕获它们。

/\(([^()]+)\)]\s*(.*?)\s*\(([^()]*)\)\s*\[([^\][]*)]\s*(.*?)\s*\(([^()]+)\)\s*(.*?)\s*\((.*)\)/

请参阅正则表达式演示。

细节

  • \(-achar
  • ([^()] )-第1组:除了
  • 之外的1个或多个字符
  • \)]\s*-)]和0空格
  • (.*?)-第2组:除换行符以外的任何0个字符,尽可能少
  • \s*\(-0空格,
  • ([^()]*)-第3组:除了
  • 之外的1个或多个字符
  • \)\s*\[-,0空格,[
  • ([^\][]*)-第4组:除了[]
  • 之外的1个或多个字符
  • ]\s*-]和0空格
  • (.*?)-第5组:除换行符以外的任何0个字符,尽可能少
  • \s*\(-0空格,
  • ([^()] )-第6组:除了
  • 之外的1个或多个字符
  • \)\s*-和0空格
  • (.*?)第7组:除换行符以外的任何0个字符,尽可能少
  • \s*\(-0空格和
  • (.*)-第8组:除换行符以外的任何0个字符,尽可能多
  • \)-char.

ES6代码段:

var s = "[NeMo (PROD)] 10.10.100.100 (EFA-B-3) [Brocade FC-Switch ] Sensor: Power Supply #1 (SNMP Custom Table) Down (No Such Name (SNMP error # 2))";
let [_, system, ip, location1, device, sensor, sensorArt, sensorState, errorMsg] = s.match(/\(([^()]+)\)]\s*(.*?)\s*\(([^()]*)\)\s*\[([^\][]*)]\s*(.*?)\s*\(([^()]+)\)\s*(.*?)\s*\((.*)\)/);
console.log(`System=${system}\nIP=${ip}\nLocation=${location1}\nDevice=${device}\nSensor=${sensor}\nSensorArt=${sensorArt}\nSensorState=${sensorState}\nErrorMsg=${errorMsg}`);