当前位置: 首页 > 知识库问答 >
问题:

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

沈子实
2023-03-14

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

我想匹配以下字符串:

>

  • 诺伊尔电影 a von 1000

    诺伊尔电影a von 1000 mit b

    诺伊尔电影a von 1000 mit b und c

    1000英镑的新电影

    诺伊尔电影公司

    诺伊尔电影a mit b und c

    诺伊尔电影a mit b und c und

    我的正则表达式如下所示:

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

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

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

  • 共有1个答案

    朱越
    2023-03-14

    你真的需要使用非捕获可选组(比如< code >(?:...)?),但是除此之外,您还需要锚点(^匹配字符串的开头,而< code>$匹配字符串的结尾)和懒惰点匹配模式(< code >)。*?,以匹配尽可能少的任何字符)。

    您可以使用

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

    参见正则表达式演示。在演示中,< code>/gm修饰符是必需的,因为输入是多行字符串。

    模式详细信息:

    • ^-字符串锚的开始
    • [nN]euer[Ff]ilm-诺伊尔胶片/诺伊尔胶片/诺伊尔胶片
    • \s*-零个或多个空格
    • (. *?) -第1组:除换行符之外的任何0个字符,尽可能少(即,直到后续子模式的最左边出现)
    • (?:\s*[vV]on\s(\d{4}))? -1或0次出现:
      • \s*-0个空格
      • [vV]on-vonorVon
      • \s-1个空格
      • (\d{4})-组2:4位
        < li> \s - 1个空格 < Li > < code >[Mm]it -< code > Mit 或< code>mit < li> \s* - 0个空格 < li > <代码>(*?) -组3匹配除换行符以外的任何0字符,越少越好 < li> (?:\s*[uU]nd\s*。*))? -可选的非捕获组匹配 < ul > < Li > < code > \ s *[uU]nd \ s * -< code>und或< code > Und 用0个空格括起来 < li > <代码>(*) - Group 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]);
         }
         
      }

     类似资料:
    • 在Python中,如何在非捕获组中捕获组?换句话说,如何重复包含捕获组的非捕获子模式? 例如,捕获导入字符串上的所有包名。例如,字符串: 导入熊猫、操作系统、系统 将返回“pandas”、“os”和“sys”。下面的模式捕获第一个包并到达第二个包: 从这里,我想重复捕获组并匹配以下字符的子模式,即。当我用一个非捕获组包围这个子模式并重复它时: 它不再捕捉里面的群体。

    • 我有一个具有多个可选和非捕获组的正则表达式。所有这些组都可能发生,但不必发生。正则表达式应使用非捕获组返回整个字符串。 当我将最后一个组也设置为可选时,正则表达式将具有多个分组结果。当我将第一组设置为非可选时,正则表达式匹配。为什么? 输入将类似于,预期输出。 提前感谢!

    • 本文向大家介绍PHP正则表达式之捕获组与非捕获组,包括了PHP正则表达式之捕获组与非捕获组的使用技巧和注意事项,需要的朋友参考一下 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中

    • 我有一个带有(?:)格式的非捕获组的java正则表达式,我不明白为什么它为非捕获组提供“null”匹配。 如果我将下面的正则表达式缩短为“@te(st)(?:AA)?”使用相同的?:非捕获组,它给出了我认为的预期行为,只匹配1个组和完全匹配。

    • 我有一个带有(?:)格式的非捕获组的java正则表达式,我不明白为什么它为非捕获组提供“null”匹配。 如果我把下面的正则表达式缩短为“@te(st)(?:aa)?”用同样的非捕获组,它给出了我所期望的行为,只匹配1组和完全匹配。 参见下面的正则表达式: 结果: “@te(st)(?:aa)”的结果使用相同的代码: 第一个将非捕获组匹配为null的正则表达式是什么?

    • 假设我有这个虚拟URL,我需要提取植物及其颜色作为 下面的I have正在按预期捕获我需要的元素,但是当我的URL中的植物少于4株时,它无法捕获任何东西。底部有一个指向regex测试员的链接,其中有示例代码和URL,您可以使用。 如何修改这个正则表达式,使其动态工作,从而在不需要静态URL结构的情况下捕获可用内容。现在,假设我最多只能捕获4株植物(8组) https://regex101.com/