我是一个正则表达式新手,花了数小时试图解决这个难题。
我认为我必须使用某种可选的非捕获组或备用组。

我要匹配以下字符串:



我的正则表达式看起来像这样:

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

问题在于它仅匹配字符串3和4。它不匹配最后两个“und”,而是将其打包在3号组中,而不是4号组中。

有人可以为我的Regex提供帮助吗(这不是很用户友好;)

最佳答案

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

您可以使用

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

参见regex demo。在演示中,由于输入是多行字符串,因此/gm修饰符是必需的。

模式详细信息:
  • ^-字符串 anchor
  • 的开始
  • [nN]euer [Ff]ilm-Neuer film / Neuer Film / neuer Film
  • \s*-零个或多个空格
  • (.*?)-组1:除换行符以外的任何0+字符,并且尽可能少(即,直到后续子模式的最左出现)
  • (?:\s*[vV]on\s+(\d{4}))?-1次或0次出现:
  • \s*-0+空格
  • [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+空格
  • (.*?)-组3匹配除换行符以外的任何0+字符,
  • 尽可能少
  • (?:\s*[uU]nd\s*(.*))?-可选的非捕获组匹配
  • \s*[uU]nd\s*-包含0+空格的undUnd
  • (.*)-组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]);
       }
    
    }

    关于javascript - 正则表达式可选非捕获组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43354986/

    10-10 18:35