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

正则表达式中的非捕获组是什么?,第1张

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

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

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

(https?|ftp)://([^/rn]+)(/[^rn]*)?

…我将得到以下结果:

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)://([^/rn]+)(/[^rn]*)?

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

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"...

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

__

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

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/,它提供了大量有关正则表达式工作原理的详细信息。它还提供了一些正则表达式引擎供您选择。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5002970.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存