C#正则表达式查找捕获的组数

时间:2018-06-30 04:16:37

标签: c# regex replace

假设此模式替换字符串中的所有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_标签替换所有URL,但将分隔符都保留在字符串的左侧和右侧。

据我所知,$1在模式开始时指的是([\n ]|^)?,但我在模式结束时找不到([\n ]|^)?的正确数字!

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

我测试了$ 2- $ 8,没有人是正确的。

有没有针对这种情况的特定规则?

2 个答案:

答案 0 :(得分:1)

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

尝试一下:

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

答案 1 :(得分: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