正则表达式可选的非捕获组

时间:2017-04-11 19:48:51

标签: javascript regex

我是一个完整的正则表形Noob,花了好几个小时试图解决这个难题。 我想我必须使用某种可选的非捕获组或交替。

我想匹配以下字符串:

  
      
  1. Neuer Film a von 1000

  2.   
  3. Neuer Film a von 1000 mit b

  4.   
  5. Neuer Film a von 1000 mit b und c

  6.   
  7. Neuer Film a von 1000 mit b und c und d

  8.   
  9. Neuer Film a mit b

  10.   
  11. Neuer Film a mit b und c

  12.   
  13. Neuer Film a mit b und c und d

  14.   

我的正则表达式如下:

var regex = /(?:[nN]euer [Ff]ilm\s?)(.*)(?:[vV]on).(\d{4}).(?:[Mm]it)(.*)(?:[uU]nd)(.*)/g;

问题是它只匹配字符串3和4.它与最后两个“und”不匹配,但是将它打包在组No.3中而不是组No.4中。

有人可以帮助我的正则表达式(根本不是非常用户友好;)

1 个答案:

答案 0 :(得分:7)

您确实需要使用非捕获可选组(例如(?:...)?),但此外,您还需要 anchors ^来匹配字符串的开头和$以匹配字符串结束)和懒字点匹配模式.*?,以匹配尽可能少的字符。)

您可以使用

/^[nN]euer [Ff]ilm\s*(.*?)(?:\s*[vV]on\s+(\d{4}))?(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?$/

请参阅regex demo。在演示中,/gm修饰符是必需的,因为输入是多行字符串。

模式详情

  • ^ - 字符串锚的开始
  • [nN]euer [Ff]ilm - Neuer film / Neuer Film / neuer Film
  • \s* - 零个或多个空格
  • (.*?) - 第1组:除了换行符之外的任何0 +字符,尽可能少(也就是说,直到最左边后续子模式的出现)
  • (?:\s*[vV]on\s+(\d{4}))? - 1次或0次出现:
    • \s* - 0+ whitespaces
    • [vV]on - vonVon
    • \s+ - 1+空格
    • (\d{4}) - 第2组:4位
  • (?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)? - 一个可选的非捕获组,匹配1或0次出现:
    • \s+ - 1+空格
    • [Mm]it - Mitmit
    • \s* - 0+ whitespaces
    • (.*?) - 第3组匹配除了换行符之外的任何0 +字符,尽可能少
    • (?:\s*[uU]nd\s*(.*))? - 可选的非捕获组匹配
      • \s*[uU]nd\s* - undUnd附有0 +空格
      • (.*) - 第4组匹配除了换行符之外的任何0+字符,尽可能多
  • $ - 字符串结束。



var strs = ['Neuer Film a von 1000','Neuer Film a von 1000 mit b','Neuer Film a von 1000 mit b und c','Neuer Film a von 1000 mit b und c und d','Neuer Film a mit b','Neuer Film a mit b und c','Neuer Film a mit b und c und d'];
var rx = /^[nN]euer [Ff]ilm\s*(.*?)(?:\s*[vV]on\s+(\d{4}))?(?:\s+[Mm]it\s*(.*?)(?:\s*[uU]nd\s*(.*))?)?$/;
for (var s of strs) {
   var m = rx.exec(s);
   if (m) {
     console.log('-- ' + s + ' ---');
     console.log('Group 1: ' + m[1]);
     if (m[2]) console.log('Group 2: ' + m[2]);
     if (m[3]) console.log('Group 3: ' + m[3]);
     if (m[4]) console.log('Group 4: ' + m[4]);
   }
   
}