【问题标题】:C# regex finding the number of captured groupC#正则表达式查找捕获组的数量
【发布时间】:2018-06-30 04:16:37
【问题描述】:

假设此模式用于替换字符串中的所有 URL

string domains = "(gl|me|com|ir|org|net|edu|info|me|ac|name|biz|co|pro|ws|asia|mobi|tel|eu|in|ru|tv|cc|es|de|ca|mn|bz|uk|us|au)";

string pattern = @"([\n ]|^)?(((https?|ftp)://)?(www\.)?([\w\d-]+\.)+" + domains + @"([/][\w\d_~:?#@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?";

我想用_URL_ 标记替换所有网址,但将分隔符保留在字符串的左右两侧。

据我所知,$1 指的是模式开头的([\n ]|^)?,但我找不到模式末尾的([\n ]|^)? 的正确数字!

Regex.Replace(data, pattern, "$1_URL_$?"); // what should be replaced by ?

我测试了 2-8 美元,没有一个是正确的。

这种情况有什么具体的规定吗?

【问题讨论】:

  • [\w\d__ 中不需要,因为\w 已经包含它。

标签: c# regex replace


【解决方案1】:

由于您只需要匹配完整 URL 的组,因此将所有内括号转换为 non-capture groups()(?:)。您可能还希望将域直接集成到模式中:

([\n ]|^)?((?:(?:https?|ftp)://)?(?:www\.)?(?:[\w\d-]+\.)+(?:gl|me|com|ir|org|net|edu|info|me|ac|name|biz|co|pro|ws|asia|mobi|tel|eu|in|ru|tv|cc|es|de|ca|mn|bz|uk|us|au)(?:[/][\w\d_~:?#\@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?

然后,前锚被捕获到$1,后锚被捕获到$3。或者,如果您愿意,也可以将组 $2 中的剩余 URL 转换为非捕获组。

Demo

【讨论】:

    【解决方案2】:

    根据您的要求,您似乎不需要捕获剩余组,因此您可以为它们使用非捕获组。

    试试这个:

    string pattern = @"([\n ]|^)?(?:(?:(?:https?|ftp)://)?(?:www\.)?(?:[\w\d-]+\.)+" + domains + @"(?:[/][\w\d_~:?#@!%$&'()*+,;=`\[\]\.\-]+)*)([\n ]|$)?";
    

    string domains = (?:gl|me|com|ir|org|net|edu|info|me|ac|name|biz|co|pro|ws|asia|mobi|tel|eu|in|ru|tv|cc|es|de|ca|mn|bz|uk|us|au)
    

    然后您可以简单地将$2 用于第二组

    此外,我建议您只需使用一个捕获组并将其替换为_URL_

    演示:https://regex101.com/r/UjyOKU/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-12
      • 2019-10-05
      • 2020-05-07
      • 1970-01-01
      • 2021-08-02
      • 2018-03-11
      相关资源
      最近更新 更多