当前位置: 首页 > 面试题库 >

正则表达式中的非捕获组是什么?

周浩淼
2023-03-14
问题内容

非捕获组(即(?:))在正则表达式中如何使用?它们有什么用?


问题答案:

让我尝试用一​​个例子来解释。

现在,如果我将下面的正则表达式应用于它…

(https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?

…我将得到以下结果:

Match "http://stackoverflow.com/"
     Group 1: "http"
     Group 2: "stackoverflow.com"
     Group 3: "/"

Match "https://stackoverflow.com/questions/tagged/regex"
     Group 1: "https"
     Group 2: "stackoverflow.com"
     Group 3: "/questions/tagged/regex"

但我不在乎协议-我只想要URL的主机和路径。因此,我将正则表达式更改为包括非捕获组(?:)。

(?:https?|ftp)://([^/\r\n]+)(/[^\r\n]*)?

现在,我的结果如下所示:

Match "http://stackoverflow.com/"
     Group 1: "stackoverflow.com"
     Group 2: "/"

Match "https://stackoverflow.com/questions/tagged/regex"
     Group 1: "stackoverflow.com"
     Group 2: "/questions/tagged/regex"

看到?第一组尚未被捕获。解析器使用它来匹配文本,但是稍后在最终结果中将其忽略。

编辑:
根据要求,我也尝试解释群组。

好吧,团体有许多目的。它们可以帮助您从较大的匹配项(也可以命名)中提取确切的信息,可以让您重新匹配先前匹配的组,并可以用于替换。让我们尝试一些例子,对吧?

想象一下,您有某种XML或HTML(请注意,正则表达式可能不是完成此工作的最佳工具,但它很好地举例说明了这一点)。您想解析标签,因此可以执行以下操作(我添加了空格以使其更易于理解):

   \<(?<TAG>.+?)\> [^<]*? \</\k<TAG>\>
or
   \<(.+?)\> [^<]*? \</\1\>

第一个正则表达式具有一个命名组(TAG),而第二个正则表达式使用一个公共组。这两个正则表达式执行相同的操作:它们使用第一组中的值(标签名称)来匹配结束标签。区别在于,第一个使用名称来匹配值,第二个使用组索引(从1开始)。

现在让我们尝试一些替换。考虑以下文本:

Lorem ipsum dolor sit amet consectetuer feugiat fames malesuada pretium egestas.
现在,让我们在它上面使用这个愚蠢的正则表达式:

\b(\S)(\S)(\S)(\S*)\b

此正则表达式匹配至少包含3个字符的单词,并使用组来分隔前三个字母。结果是这样的:

Match "Lorem"
     Group 1: "L"
     Group 2: "o"
     Group 3: "r"
     Group 4: "em"
Match "ipsum"
     Group 1: "i"
     Group 2: "p"
     Group 3: "s"
     Group 4: "um"
...

Match "consectetuer"
     Group 1: "c"
     Group 2: "o"
     Group 3: "n"
     Group 4: "sectetuer"
...

因此,如果我们应用替换字符串:

$1_$3$2_$4

…在它上面,我们尝试使用第一组,添加一个下划线,使用第三组,然后使用第二组,添加另一个下划线,然后是第四组。结果字符串类似于下面的字符串。

L_ro_em i_sp_um d_lo_or s_ti_ a_em_t c_no_sectetuer f_ue_giat f_ma_es m_la_esuada p_er_tium e_eg_stas.

您也可以使用命名组来进行替换${name}。

要使用正则表达式,建议使用http://regex101.com/,它提供了大量有关正则表达式工作原理的详细信息。它还提供了一些正则表达式引擎供您选择。



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

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

  • 我是一个完全的正则表达式新手,花了几个小时试图解决这个难题。我认为我必须使用某种可选的非捕获组或交替。 我想匹配以下字符串: > 诺伊尔电影 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 我的正则表达式

  • 问题内容: 从Java 6 模式文档中: 特殊构造(非捕获) X X ,作为非捕获组 … X X ,作为独立的非捕获组 之间和有什么区别?在这种情况下, 独立 意味着什么? 问题答案: 这意味着分组是原子的,它会丢弃匹配组的回溯信息。因此,该表达式是所有格;即使这样做是正则表达式整体成功的唯一途径,它也不会退缩。它是“独立的”,即它不会通过回溯与正则表达式的其他元素协作来确保匹配。

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

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